Spring Boot数据访问之多数据源配置及数据源动态切换
对于一个数据源的配置在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)和Spring Boot数据访问之Druid连接池的配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中均有涉及,不同之处在于数据库连接池不一样:前者有Spring Boot提供,后者使用第三方提供的数据库连接池。
如果一个数据库数据量过大,考虑到分库分表和读写分离需要动态的切换到相应的数据库进行相关操作,这样就会有多个数据源。实际业务访问的是哪个数据源怎么合理有效的处理呢?
上图中2就是实际生产中会遇到的情况,可以看到多个数据源对应了多个SessionFactory。可不可以多个数据源只有一个SessionFactory呢?答案是可以的,Spring Boot为实现该模式提供了便利。
首先多数据源配置:
测试案例:pojo之类的就不截图了,仅截图测试类如下:
测试结果:
实际上两个数据库中的数据并不一样:
但是测试时访问的都是master数据库。那slave数据库根本无法访问到,实际生产中肯定在某些时候一定访问slave,这么解决呢?办法就是动态切换数据源。Spring内置了一个AbstractRoutingDataSource帮助完成动态数据源切换。下面先看这个抽象类:
阅读源码可知其中一个核心的方法setTargetDataSourcese,它需要一个Map进行赋值。这个Map存储的就是我们配置的多个数据源的键值对。其切换数据源的运作方式就是在连接数据库之前执行determineCurrentLookupKey方法返回的数据作为key去targetDataSources中查找相应的值,找到就用此DataSource获取数据库链接。
此类是抽象类,如果使用话需创建其的一个子类并实现获取key的方法determineCurrentLookupKey——即写我们自己的规则获取相应数据源。以上面的测试案例示例:
重写determineCurrentLookupKey:
配置类中增加主数据源配置:
修改测试案例:
测试结果:
上述动态切换数据源还可以优化,具体参考Spring Boot数据访问之声明式动态数据源切换
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?