首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
SpringBoot多数据源配置,看这一篇就够了
📅 2026/9/18 19:16:52
✍️ 爱科研究院
👁 阅读 3,247
做业务开发迟早会遇到一个需求一个项目要连多个数据库。可能是读写分离主库写、从库读可能是业务隔离订单库和用户库分开也可能是历史遗留老系统数据要同步查询。这时候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的顺序每个数据源都要配连接池监控。把这篇收藏下次配多数据源十分钟搞定。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/9/18 19:16:52
三年Java经验,却挂在这些面试题上
2026/9/18 19:16:52
TiXL 图像合成变换(ImageComposeTransform)上下文机制设计解析:让 UV 变换在整个纹理图内免费生效
2026/9/18 19:11:52
从LGTM到Open Code Review:代码评审的规则落地与自动化实践
2026/9/18 19:46:55
Symphony支持5大项目管理工具:Linear、GitHub Issues、Jira、Asana、GitLab集成详解
2026/9/18 19:46:55
GD32F103VET6 八款 RTOS 实测:上下文切换、中断与资源占用
2026/9/18 19:46:55
模拟电子技术基础课后答案PDF:OCR解析与可检索题库构建
2026/9/18 19:46:55
昇腾 HCCL 开源仓 CI 失败诊断与修复指南:从 `/compile` 触发到 `passed` 的完整闭环
2026/9/18 19:46:54
3ds Max零基础硬表面建模:AK47全流程实战
2026/9/18 19:41:54
Ollama 的 11434 端口打不开?让走 TaoToken 的 Codex 查
2026/9/18 0:04:47
AReaL 调试指南:从 Agent Workflow 验证到分布式训练死锁诊断
2026/9/18 0:04:47
MATLAB实现GPS L1 C/A信号仿真与二维捕获验证
2026/9/18 0:04:47
彻底搞懂ASCII、Unicode与UTF-8:从乱码根源到编码实战
2026/9/18 16:05:49
拯救者Y7000黑屏故障排查与维修实战指南
2026/9/18 3:56:12
AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
2026/9/18 13:25:13
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化