当前位置: 首页 > news >正文

Java怎么在数据库里配置多个数据源,然后进行动态切换?

这其实触碰到了 Java 后端架构中一个非常痛点的领域:多数据源(Multi-DataSource)的管理

市面上 90% 的教程只教你怎么贴配置,却没告诉你原理。结果就是上线后,要么事务回滚失败,要么切库切了个寂寞。

今天,我们就把MyBatisMyBatis-PlusHibernate拉到手术台上,从底层源码的角度,彻底讲透它们的区别以及多数据源的最佳解法。

一、 为什么多数据源这么难搞?

在 Spring 的世界里,单数据源是幸福的。容器启动时,创建一个DataSource,这就好比你只有一张银行卡,刷卡时不需要动脑子。

但当你需要连接多个数据库(比如:主从库读写分离、分库分表、或者连接老系统的遗留库)时,问题就来了:Spring 怎么知道这一行 SQL 该发给谁?

本质上,多数据源的实现只有两条路:

  1. 静态分包(物理隔离):你的UserMapper永远连库 A,OrderMapper永远连库 B。
  2. 动态路由(逻辑切换):同一个UserMapper,这一次查库 A,下一次查库 B。

二、 核心原理:Spring 的“魔术师”

无论你用 MyBatis 还是 Hibernate,想要实现动态切换,绕不开 Spring 提供的一个核心类:AbstractRoutingDataSource

它的原理其实非常简单,就像一个路由器

  1. 它内部维护了一个Map<Object, DataSource>,存了所有可用的真实数据源。
  2. 它实现了一个方法determineCurrentLookupKey()
  3. 关键点:当数据库连接被请求时,它会先去调用这个方法,通常是从当前线程的ThreadLocal中拿到一个 Key(比如 “master” 或 “slave”)。
  4. 拿着 Key 去 Map 里找,找到谁,就用谁。

听起来很简单?别急,坑在后面。不同的 ORM 框架对这个“路由器”的兼容性天差地别。


三、 Hibernate (JPA) 的“倔强”

很多用 JPA 的同学尝试用AbstractRoutingDataSource做动态切换,往往会撞得头破血流。

为什么?因为 Hibernate 太“智能”了。

Hibernate 有一级缓存(Session)和复杂的上下文管理。在一个事务(Transaction)开启的瞬间,Hibernate 就需要确定EntityManager,并绑定一个数据库连接。一旦绑定,在这个事务结束前,它通常不会轻易释放或切换连接。

这就导致了一个经典 Bug:你在 Service 层加了注解想切库,但因为事务早已开启,Hibernate 根本不理会你的ThreadLocal变动,依然倔强地用着主库的连接。

Hibernate 的最佳解法:分包隔离(Split Packages)

既然动态切换容易出事,那就物理隔离。

  • 将所有连接 A 库的 Repository 放在com.app.repo.primary
  • 将所有连接 B 库的 Repository 放在com.app.repo.secondary
  • 配置两套EntityManagerFactoryTransactionManager

虽然配置繁琐(要写两个 Configuration 类),但这是 JPA 下最稳健的方案。

四、 MyBatis-Plus 的“优雅”

相比之下,MyBatis(及其增强版 MyBatis-Plus)就显得非常轻量级听话

MyBatis 执行 SQL 的过程是无状态的,它没有复杂的 Session 缓存包袱。只要在执行 SQL 的那一刻,SqlSessionFactory拿到了正确的连接,它就能工作。

因此,MyBatis-Plus (MP)成为了国内处理多数据源的首选。

MP 生态中有一个神器:dynamic-datasource-spring-boot-starter。它的实现原理是AOP + AbstractRoutingDataSource的完美结合:

  1. 注解标记:在方法上加@DS("slave")
  2. AOP 拦截:拦截器在方法执行前,把 “slave” 塞进ThreadLocal
  3. 路由执行:到底层执行 SQL 时,路由器读取ThreadLocal,瞬间切换数据源。
  4. 自动清理:方法结束后,AOP 自动清理ThreadLocal,防止污染。

五、 原理可视化(点击查看大图)

为了让你更直观地理解,三味画了两张图:

图 1: Spring 动态数据源路由原理 (通用)

图 2: MyBatis-Plus vs Hibernate 多数据源策略对比


六、 抄作业:企业级最佳实践代码

如果你在做互联网业务系统,强烈建议使用 MyBatis-Plus + dynamic-datasource的组合。这是目前最优雅、代码侵入性最小的方案。

1. 引入依赖 (pom.xml)

<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.6.1</version> </dependency>

2. 配置文件 (application.yml)看,多么清爽!

spring: datasource: dynamic: primary: master # 默认走主库 strict: false # 严格模式,匹配不到数据源是否报错 datasource: master: url: jdbc:mysql://192.168.1.100:3306/main_db username: root slave_1: url: jdbc:mysql://192.168.1.101:3306/main_db username: root

3. 业务代码 (Service)一个注解搞定切换,谁用谁知道。

@Service public class OrderService { @Autowired private OrderMapper orderMapper; // 默认走 master,用于写入 public void createOrder(Order order) { orderMapper.insert(order); } // 显式声明走从库,用于查询 @DS("slave_1") public Order getOrderInfo(Long id) { return orderMapper.selectById(id); } }

七、 避坑指南(重点!)

如果你一定要在项目中混用(JPA + MP)或者使用多数据源,请务必注意:

  1. 事务的边界:@Transactional开启时,连接就已经确定了!不要试图在@Transactional方法内部再去调用加了@DS的方法,不会生效的!数据源切换必须发生在事务开启之前。
  2. 连接泄露:以前手动写ThreadLocal切换数据源时,最容易忘记remove(),导致线程复用时带着上一次的脏数据源。使用 MP 的 Starter 可以帮你自动处理这个清理工作。

总结

  • Hibernate/JPA:适合业务逻辑极其复杂、领域模型驱动(DDD)的项目,多数据源建议用分包隔离
  • MyBatis/MyBatis-Plus:适合绝大多数互联网业务、需要极致 SQL 掌控的项目,多数据源建议用dynamic-datasource动态切换。
  • 原理:一切魔法的尽头,都是 Spring 的AbstractRoutingDataSource和 AOP。

只有懂到底层,才能在报错时从容不迫。

如果你觉得这篇文章让你学到了东西,哪怕是一个知识点,请帮点个赞或者转发给需要的朋友,这对我很重要!

http://www.jsqmd.com/news/317447/

相关文章:

  • 总结缙云值得推荐的冷轧钢带公司,排名如何?
  • 推荐窑胴体扫描仪制造商有哪些,铭耀机电价格贵不贵
  • 2026深圳产业园办公室及科技孵化园出租推荐
  • 软银/英伟达/红杉资本/贝佐斯等参投,机器人初创公司Skild AI融资14亿美元,打造通用基础模型
  • 【ES】[其他] ---- 忘记 Elasticsearch 8.0 密钥与账号密码?两步轻松重置与生成?
  • 基差风险管理系统操作日志导出与审计应用
  • 企业风险管理系统派生报表设计与实现
  • 基差风险管理系统冲突预警模块设计与实现
  • 2026年学习桌椅品牌权威推荐榜:预算3-8k配置密度与实木环保颜值深度对比
  • 套期保值管理系统系统监控工具与应用实践
  • QPainterPath判断点是否在路径内
  • 企业套保策略平台合同与交易联动机制
  • 国内外水处理设备哪家好?2026最新厂家推荐,涵盖定制、全自动、专业级全品类
  • 2026深圳宝安可申请租金补贴及企业落户奖励的创业园区推荐
  • 【ES】【实战】----index索引数量过大,后缀加日期处理 实战过程 xxxx_20250906
  • c++的RAII
  • 2026深圳办公室出租推荐:产业园区与电商孵化空间深度解析
  • 2026年湖北旅游攻略路线推荐:深度评测与排名,涵盖自然与人文场景核心痛点
  • 2026年当下知名的推拉窗设计需要多少钱,六轨断桥推拉窗/门窗/安全门窗/断桥铝门窗,推拉窗直销厂家选哪家
  • 2026年1月安徽高端偶联剂/钛酸酯偶联剂/钛酸异丙酯/交联剂/钛酸酯交联剂/钛酸正丁酯采购终极指南:赋能材料未来
  • 2026年快充充电宝品牌推荐与深度解析:便携大容量安全选购权威指南
  • Nodejs+vue微信小程序的大学生专业认证考试资源共享平台
  • 大模型Memory系统完全指南:从技术原理到工程实践的全面解析(建议收藏)
  • Nodejs+vue志愿者活动报名服务小程序设计与开发
  • 从零开始学大模型评估:DeepResearchEval框架全面解析与实战(收藏必学)
  • 大视觉语言模型完全指南:多模态虚假新闻检测技术详解与学习路径
  • 微调之后还能做什么?大模型后训练完全指南:从理论到实践,小白也能懂
  • 强烈安利9个AI论文软件,本科生轻松搞定毕业论文!
  • 2026年选矿设备厂家推荐:基于多场景实测评价,解决效率与兼容性核心痛点
  • 亲测好用!继续教育10款一键生成论文工具深度测评