Spring Boot 多数据源切换实战:基于 dynamic-datasource 的优雅实现

在现代企业级应用中,多数据源场景日益普遍,如订单库与用户库分离、读写分离架构、多租户数据隔离等。传统的单数据源配置已无法满足复杂业务需求,而手动管理多数据源切换又会导致代码耦合度高、维护困难等问题。本文将基于 dynamic-datasource-spring-boot-starter 组件,从零构建一个多数据源切换的完整示例,带你掌握注解驱动的数据源动态切换技术。

一、多数据源方案选型

实现多数据源切换主要有三种方案:

  1. 基于 AbstractRoutingDataSource 自定义实现:需手动编写数据源路由、AOP 切面和上下文管理,灵活性高但开发成本大。
  2. 固定数据源绑定:为不同数据源创建独立的 SqlSessionTemplate 或 JdbcTemplate,适合简单场景但扩展性差。
  3. 分库分表中间件:如 Sharding-JDBC,通过 SQL 解析实现透明路由,适合复杂分库分表场景但学习成本高。

本文选择 baomidou 开源的 dynamic-datasource-spring-boot-starter,它基于第一种方案封装,提供了注解驱动的开箱即用体验,完美平衡了开发效率和灵活性。其核心原理是:

  • 通过 AbstractRoutingDataSource 实现数据源路由
  • 利用 ThreadLocal 维护线程级数据源上下文
  • 基于 AOP 拦截 @DS 注解实现动态切换

二、环境准备与依赖配置

2.1 技术栈版本

选择兼容的技术栈版本至关重要,本文使用经过验证的版本组合:

  • Spring Boot: 2.1.3.RELEASE
  • dynamic-datasource-spring-boot-starter: 2.5.7
  • MyBatis: 2.1.1
  • MySQL: 5.7
  • HikariCP: 2.7.9(Spring Boot 默认连接池)

2.2 数据库准备

创建两个独立的数据库用于演示:

  1. 订单库(test_orders)
CREATE TABLE `orders` (
  `id` int(11) DEFAULT NULL COMMENT '订单编号',
  `user_id` int(16) DEFAULT NULL COMMENT '用户编号',
  `order_no` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单编号',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

INSERT INTO `orders` VALUES (1, 1, 'ORDER20240901001', '2024-09-01 10:00:00');
  1. 用户库(test_users)
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
  `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
  `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值