在现代企业级应用中,多数据源场景日益普遍,如订单库与用户库分离、读写分离架构、多租户数据隔离等。传统的单数据源配置已无法满足复杂业务需求,而手动管理多数据源切换又会导致代码耦合度高、维护困难等问题。本文将基于 dynamic-datasource-spring-boot-starter 组件,从零构建一个多数据源切换的完整示例,带你掌握注解驱动的数据源动态切换技术。
一、多数据源方案选型
实现多数据源切换主要有三种方案:
- 基于 AbstractRoutingDataSource 自定义实现:需手动编写数据源路由、AOP 切面和上下文管理,灵活性高但开发成本大。
- 固定数据源绑定:为不同数据源创建独立的 SqlSessionTemplate 或 JdbcTemplate,适合简单场景但扩展性差。
- 分库分表中间件:如 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 数据库准备
创建两个独立的数据库用于演示:
- 订单库(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');
- 用户库(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

最低0.47元/天 解锁文章
3222

被折叠的 条评论
为什么被折叠?



