他们各有优缺点 , 我们需要权衡利弊进行选择:
如果一个Service只需要使用一个数据源 , 或者多个Service方法都需要使用相同的数据源 , 则建议将@DS注解添加到Mapper接口或XML文件上;如果需要根据不同的业务场景动态切换数据源 , 则可以选择在Service方法上使用@DS注解 。
当然还有一种情况 , 一个service方法操作不同的数据源 , 表结构一样的话可以使用一个mapper 。
在service内部进行切换 , 我们看到官方注释 , 「非必要不要这么使用」!
// 设置当前线程数据源 如非必要不要手动调用 , 调用后确保最终清除DynamicDataSourceContextHolder.push("slave_1");// 获得当前线程数据源DynamicDataSourceContextHolder.peek();// 强制清空本地线程 防止内存泄漏 , 如手动调用了push可调用此方法确保清除DynamicDataSourceContextHolder.poll();完整代码块:
@Overridepublic Result saveTest() {Test test = new Test();test.setId(1993);test.setName("add方法");// 切换指定数据源DynamicDataSourceContextHolder.push("slave_1");testDbMapper.insert(test);//查看当前数据源log.info(DynamicDataSourceContextHolder.peek());//移除数据源 , 恢复master数据源DynamicDataSourceContextHolder.clear();testDbMapper.insert(test);return Result.success("222");}

文章插图
数据库展示:

文章插图
6、测试我们还是以把@DS放在mapper类上来进行演示:
@Autowiredprivate TestDbMapper testDbMapper;@Autowiredprivate TestDb2Mapper testDb2Mapper;@Overridepublic Result saveTest() {Test test = new Test();test.setId(1994);test.setName("add方法");testDbMapper.insert(test);testDb2Mapper.insert(test);return Result.success("222");}
文章插图
数据库正常保存到两个库 , 测试通过!

文章插图
7、事务问题在使用多数据源的同时 , 也带来了一下事务问题 , 如果一个方法添加了@Transactional(rollbackFor = Exception.class)事务 , 默认查询只会从默认库来查询 。
这个问题是要解决的 , 这里小编给几个思路大家可以试一下!
- Spring Boot提供了一个基于Atomikos的JTA实现 。
- 可以配置多个DataSourceTransactionManager进行管理事务 。
三、总结希望这篇博客能够帮助读者更好地理解和掌握Spring Boot和MyBatis-Plus多数据源的使用方法 , 并应用到实际项目中去 。同时 , 也提醒读者在使用多数据源的时候要注意事项 , 比如事务管理、连接池配置等 , 以确保系统的稳定性和可靠性 。
推荐阅读
- SpringBoot自动装配原理
- Spring/SpringBoot中的声明式事务和编程式事务源码、区别、优缺点、适用场景、实战
- SpringBoot+Vue+ES 实现仿百度全文搜索
- SpringBoot整合RocketMQ,老鸟们都是这么玩的!
- 在 SpringBoot 中使用 Spring AOP 实现接口鉴权
- SpringBoot中如何实现限流,这种方式才叫优雅!
- SpringBoot中使用PostgreSQL数据库
- SpringBoot对SpringMVC的自动配置,你知道多少?
- AI开发大一统:谷歌OpenXLA开源,整合所有框架和AI芯片
- SpringBoot启动控制台的banner是怎么回事
