ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

SpringBoot多数据源配置,看这一篇就够了

2026/9/18 19:16:52 拓冰建站 浏览量
SpringBoot多数据源配置,看这一篇就够了 做业务开发迟早会遇到一个需求一个项目要连多个数据库。可能是读写分离主库写、从库读可能是业务隔离订单库和用户库分开也可能是历史遗留老系统数据要同步查询。这时候SpringBoot多数据源配置就成了绕不开的坎。网上的教程要么太浅要么互相矛盾今天这篇把原理、实现和坑一次讲透。方案怎么选多数据源实现方式主要有三种第一种手动配置多套DataSource SqlSessionFactory。最原始也最灵活。每个数据源独立配置连接池、事务管理器、Mapper扫描路径。缺点是代码量大新增数据源要改配置类。第二种使用AbstractRoutingDataSource AOP动态切换。这是Spring原生支持的方案。核心是继承AbstractRoutingDataSource重写determineCurrentLookupKey方法用ThreadLocal保存当前数据源标识。AOP在方法执行前切换执行后清理。适合读写分离、多库动态路由。第三种用现成轮子dynamic-datasource-spring-boot-starter。这是目前最推荐的方式。一个注解DS就能切换支持分组、负载均衡、事务、健康检查。下面重点讲这个。快速上手dynamic-datasource第一步引入依赖xml复制下载运行dependency groupIdcom.baomidou/groupId artifactIddynamic-datasource-spring-boot-starter/artifactId version4.3.0/version /dependency第二步application.yml配置yaml复制下载spring: datasource: dynamic: primary: master strict: false datasource: master: url: jdbc:mysql://localhost:3306/order_db username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver slave: url: jdbc:mysql://localhost:3307/user_db username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driverprimary指定默认数据源strict设为false表示找不到匹配数据源时回退到主库。第三步在Service方法上加DSjava复制下载Service public class OrderService { Autowired private OrderMapper orderMapper; DS(master) public void createOrder(Order order) { orderMapper.insert(order); } DS(slave) public ListOrder queryOrders() { return orderMapper.selectList(null); } }DS可以加在方法上也可以加在类上。方法级优先于类级。不加注解时走primary数据源。关键坑点一个都别踩坑一DS和Transactional同时使用时数据源切换失效。因为Spring事务在方法执行前就开启了此时数据源已经绑定。DS的AOP默认在事务AOP之后执行导致切换不生效。解决办法把DS加在事务方法的外层或者用DS配合Transactional(propagation Propagation.REQUIRES_NEW)确保切换发生在事务开启前。更稳妥的做法是把数据源切换逻辑放在Controller层或独立的方法中。坑二多数据源下MyBatis-Plus分页插件配置。如果每个数据源有独立的SqlSessionFactory需要分别配置分页插件。用dynamic-datasource时它统一管理SqlSessionFactory只需正常配置MybatisPlusInterceptor即可不用重复配。坑三事务管理器。dynamic-datasource会自动配置DataSourceTransactionManager但如果手动配置了多个要确保Transactional指定正确的transactionManager。否则会出现“事务不生效”或“数据源错乱”。坑四连接池监控。多数据源下Druid或HikariCP的监控页面可能只显示一个数据源。需要为每个数据源单独配置StatFilter和监控Servlet否则排查连接泄漏时两眼一抹黑。坑五循环依赖与懒加载。多个数据源互相引用时启动可能报循环依赖。加Lazy注解延迟初始化或把数据源配置类拆分避免Bean创建顺序问题。手动实现方案备选如果不想引入第三方依赖可以手动实现。核心是定义多个DataSource Bean用ConfigurationProperties绑定配置。创建DynamicDataSource继承AbstractRoutingDataSource把多个数据源放入targetDataSources。用ThreadLocal保存数据源keyAOP在方法前后设置和清除。为每个数据源配置独立的SqlSessionFactory和Mapper扫描路径。代码量大约200行适合对可控性要求极高的场景。但多数项目dynamic-datasource已经足够。总结多数据源配置不难难的是事务、切换时机和监控。记住三点优先用dynamic-datasourceDS注意和Transactional的顺序每个数据源都要配连接池监控。把这篇收藏下次配多数据源十分钟搞定。