首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
SpringBoot多数据源配置,其实没你想的那么难
📅 2026/10/4 21:12:16
✍️ 爱科研究院
👁 阅读 3,247
很多后端开发一听到“多数据源”就头大觉得要写一堆配置、切面、注解还容易踩坑。其实SpringBoot多数据源的核心就一句话动态路由 多个DataSource Bean。搞懂这个半小时就能跑起来。为什么需要多数据源常见场景有三个读写分离主库写、从库读、分库分表不同业务用不同库、老系统迁移新老数据库并存。不管哪种本质都是让不同的SQL请求落到不同的数据库连接上。SpringBoot默认只配一个DataSource多数据源就是要打破这个默认。核心思路AbstractRoutingDataSourceSpring提供了一个AbstractRoutingDataSource它本身不管理连接而是根据一个determineCurrentLookupKey()方法的返回值从内部维护的targetDataSourcesMap里选一个真正的DataSource。所以我们要做三件事定义多个真实的DataSource比如master、slave。写一个类继承AbstractRoutingDataSource重写determineCurrentLookupKey()从ThreadLocal里取当前数据源标识。写一个AOP切面或注解在方法执行前把数据源标识塞进ThreadLocal执行后清理。实战配置步骤假设我们有两个库主库master和从库slave。首先在application.yml里配两个数据源yaml复制下载spring: datasource: master: jdbc-url: jdbc:mysql://localhost:3306/master_db username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver slave: jdbc-url: jdbc:mysql://localhost:3306/slave_db username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver注意多数据源时要用jdbc-url而不是url否则HikariCP会报错。然后写配置类创建两个DataSource Beanjava复制下载Configuration public class DataSourceConfig { Bean(master) ConfigurationProperties(prefix spring.datasource.master) public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } Bean(slave) ConfigurationProperties(prefix spring.datasource.slave) public DataSource slaveDataSource() { return DataSourceBuilder.create().build(); } }接着定义动态数据源类java复制下载public class DynamicDataSource extends AbstractRoutingDataSource { Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSource(); } }DataSourceContextHolder用ThreadLocal保存当前数据源java复制下载public class DataSourceContextHolder { private static final ThreadLocalString CONTEXT new ThreadLocal(); public static void setDataSource(String dataSource) { CONTEXT.set(dataSource); } public static String getDataSource() { return CONTEXT.get(); } public static void clear() { CONTEXT.remove(); } }再注册动态数据源为Primaryjava复制下载Bean Primary public DataSource dynamicDataSource(Qualifier(master) DataSource master, Qualifier(slave) DataSource slave) { MapObject, Object targetDataSources new HashMap(); targetDataSources.put(master, master); targetDataSources.put(slave, slave); DynamicDataSource dynamicDataSource new DynamicDataSource(); dynamicDataSource.setTargetDataSources(targetDataSources); dynamicDataSource.setDefaultTargetDataSource(master); return dynamicDataSource; }最后写一个注解和AOP切面java复制下载Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) public interface DS { String value() default master; }java复制下载Aspect Component public class DsAspect { Around(annotation(ds)) public Object around(ProceedingJoinPoint point, DS ds) throws Throwable { DataSourceContextHolder.setDataSource(ds.value()); try { return point.proceed(); } finally { DataSourceContextHolder.clear(); } } }使用时就很简单java复制下载DS(slave) public ListUser queryUsers() { return userMapper.selectAll(); }几个必须注意的坑第一事务问题。Transactional默认只作用于一个数据源如果方法内切换了数据源事务不会跨库。需要分布式事务时得用Seata或消息表。第二MyBatis集成。如果用了MyBatis要确保SqlSessionFactory用的是动态数据源而不是某个具体数据源。通常把动态数据源设为Primary即可。第三数据源切换失效。AOP切面要在Service层生效如果同类方法自调用切面不生效。另外ThreadLocal要在finally里清理防止线程复用串数据。第四连接池监控。多数据源下每个连接池要单独监控否则一个池满了你都不知道。总结SpringBoot多数据源配置核心就是AbstractRoutingDataSource ThreadLocal AOP。不要被“动态”“路由”这些词吓到代码量其实很少。先跑通主从切换再考虑分库分表、事务一致性。记住多数据源不是目的让正确的SQL去正确的库才是。动手试一次你会发现真的没那么难。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/4 21:12:16
Java面试被问烂的10道题,答错3道直接挂
2026/10/4 21:12:16
芯片内置时钟RE超标破局:滤波失效的三大噪声路径与协同抑制
2026/10/4 21:07:16
插件系统开发实战:plugin.json、TypeScript SDK与CLI全解析
2026/10/4 22:47:52
26年血泪总结:论文双检通过这些坑千万别踩
2026/10/4 22:47:52
AODV移动自组网仿真实战:NS2建模、脚本与性能分析
2026/10/4 22:47:52
OpenShell:构建高效跨平台终端工作台
2026/10/4 22:47:52
Windows 视频缩略图不显示?用 TaoToken 统一 Key 排查本地解码链路
2026/10/4 22:47:52
Claude学习课程集合:Anthropic官方课程与Claude API实战入门
2026/10/4 22:42:51
单细胞测序marker基因转化与GO富集分析实战:从基因列表到生物学功能解读
2026/10/4 0:00:57
Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化
2026/10/4 0:00:57
多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系
2026/10/4 0:00:57
hindsight:面向LLM应用的事后可观测性工程实践
2026/10/4 0:00:57
Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化
2026/10/4 0:00:57
多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系
2026/10/4 0:00:57
hindsight:面向LLM应用的事后可观测性工程实践
2026/10/4 2:41:08
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/4 17:59:15
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/3 15:20:14
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)