SpringBoot多数据源配置,其实没你想的那么难

发布时间:2026/10/4 21:11:59

SpringBoot多数据源配置,其实没你想的那么难 很多后端开发一听到“多数据源”就头大觉得要写一堆配置、切面、注解还容易踩坑。其实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去正确的库才是。动手试一次你会发现真的没那么难。
延伸阅读

更多相关文章

2026/10/4 21:11:59

Java面试被问烂的10道题,答错3道直接挂

Java面试中总有一些题被反复问,候选人觉得“太简单”,面试官却用它快速筛人。原因很现实:这些题看似基础,却能暴露你是否真正理解Java的设计哲学。以下10道被问烂的题,答错3道,基本宣告面试失败。1. String…

2026/10/4 21:11:59

芯片内置时钟RE超标破局:滤波失效的三大噪声路径与协同抑制

1. 项目概述:当滤波失效时,芯片内置时钟的RE超标破局之道到底在解决什么问题? “当滤波失效时:芯片内置时钟的RE超标破局之道”——这个标题一出来,我就知道又是一个被EMC实验室逼到墙角的真实战例。RE,即R…

2026/10/4 21:06:59

RealPLC Agent:TIA Portal原生AI编程闭环

1. 这不是又一个“AIPLC”的概念包装,而是TIA Portal里真正能跑通的工程闭环 我第一次在客户现场看到RealPLC Agent v1.1.0跑起来时,手里的咖啡杯差点没端稳——不是因为炫酷的UI动效,而是因为它在TIA Portal里直接调用了S7-1500的DB块&#…

2026/10/4 22:12:04

C++ 函数模板完全指南(最新整理)

前言函数模板(function template)是 C 泛型编程(generic programming)的入口。它看起来只是"把类型换成 T",但一旦深入,就会遇到一堆绕不开的问题:模板为什么必须写在头文件里&#x…

2026/10/4 22:12:04

插件到底是什么:从IAR、MusicFree到Web启动报错的机制与排障

插件(plugins)这个词,凡是折腾过几个软件、写过几年代码的人都不会陌生。但你发现没有,同样叫插件,在不同软件里的含义和用法差别很大——IAR 里装插件是为了给嵌入式 IDE 扩展静态分析或者版本管理能力,Mu…

2026/10/4 22:12:04

手把手教你用TaoToken统一API通道快速集成酷我音乐服务

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 22:12:04

PyCharm应用开发实战:从项目配置到调试测试的完整指南

简介:一套配套Packt出版社《使用PyCharm进行动手应用程序开发》的代码资源,面向具备基础Python知识、希望在真实项目中用好PyCharm的初中级开发者,也适合从其他IDE迁移过来的Python用户。内容围绕实用编码技术展开,覆盖PyCharm环境…

2026/10/4 22:12:04

ponytail插件与skill全解析:轻量可插拔工具的使用指南

1. 从“ponytail”这个热词说起:它到底指什么第一次看到“ponytail”被当成一个技术词条来搜,我其实愣了一下。字面意思就是马尾辫,一个再日常不过的发型词,怎么会跟“skill”“插件”“如何使用”这些词绑在一起冲上热搜&#xf…

2026/10/4 22:07:03

AVM全景环视系统搭建全流程:从硬件选型到量产落地

去年接到一个任务,要把一台还在图纸阶段的车型从零搭出一套AVM全景环视系统。团队里一开始有人觉得这活儿挺简单——买四个鱼眼摄像头,接上域控制器,屏幕上一拼图不就完了?等真正把整条链路走通,我才意识到&#xff0c…

2026/10/4 0:01:02

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 0:01:02

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑