Spring Boot数据访问之多数据源配置及数据源动态切换
如果一个数据库数据量过大,考虑到分库分表和读写分离需要动态的切换到相应的数据库进行相关操作,这样就会有多个数据源。对于一个数据源的配置在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)和Spring Boot数据访问之Druid连接池的配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中均有涉及,不同之处在于数据库连接池不一样:前者有Spring Boot提供,后者使用第三方提供的数据库连接池。
那么对于多数据源的数据库应该如何配置呢?首先看最简单的多数据源配置:



测试案例:pojo之类的就不截图了,仅截图测试类如下:

测试结果:

实际上两个数据库中的数据并不一样:

但是测试时访问的都是master数据库。那slave数据库根本无法访问到,实际生产中肯定在某些时候一定访问slave,这么解决呢?动态切换数据源。
Spring内置了一个AbstractRoutingDataSource帮助完成动态数据源切换。下面先看这个抽象类:

阅读源码可知其中一个核心的方法setTargetDataSourcese,它需要一个Map。这个Map存储的就是我们配置的多个数据源的键值对。其切换数据源的运作方式就是在连接数据库之前执行determineCurrentLookupKey方法返回的数据作为key去targetDataSources中查找相应的值,找到就用此DataSource获取数据库链接。
此类是抽象类,如果使用话,最有效的方式就是创建其的一个子类并实现获取key的方法determineCurrentLookupKey——即写我们自己的规则获取相应数据源。
以上面的测试案例示例:
重写determineCurrentLookupKey:


配置类中增加主数据源配置:

修改测试案例:

测试结果:

实现了数据源的动态切换。
Spring Boot数据访问之多数据源配置及数据源动态切换的更多相关文章
- Spring Boot数据访问之动态数据源切换之使用注解式AOP优化
在Spring Boot数据访问之多数据源配置及数据源动态切换 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中详述了如何配置多数据源及多数据源之间的动态切换.但是需要读数据库的地方,就 ...
- Spring Boot数据访问之Druid连接池的配置
在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中数据源连接池方式缺省(type)情况下默认使用HikariCP,那不缺省如何配置呢?我们 ...
- 06.深入浅出 Spring Boot - 数据访问之Druid
代码下载:https://github.com/Jackson0714/study-spring-boot.git 一.Druid是什么? 1.Druid是数据库连接池,功能.性能.扩展性方面都算不错 ...
- 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)
MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...
- Spring Boot数据访问之整合Mybatis
在Mybatis整合Spring - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中谈到了Spring和Mybatis整合需要整合的点在哪些方面,需要将Mybatis中数据库连接池等相关对 ...
- Spring Boot数据访问之数据源自动配置
Spring Boot提供自动配置的数据访问,首先体验下,Spring Boot使用2.5.5版本: 1)导入坐标: 2.5.25版本支持8.0.26mysql数据库驱动.spring-boot-st ...
- Spring Boot 数据访问集成 MyBatis 与事物配置
对于软件系统而言,持久化数据到数据库是至关重要的一部分.在 Java 领域,有很多的实现了数据持久化层的工具和框架(ORM).ORM 框架的本质是简化编程中操作数据库的繁琐性,比如可以根据对象生成 S ...
- Spring Boot 系列(三)属性配置&自定义属性配置
在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring boot中的模块化配置,在pom.xml中依赖的每个Starter都有默认配置,而这些默认配 ...
- 【spring boot】12.spring boot对多种不同类型数据库,多数据源配置使用
2天时间,终于把spring boot下配置连接多种不同类型数据库,配置多数据源实现! ======================================================== ...
随机推荐
- Webstorm安装与配置
一 下载 链接:https://pan.baidu.com/s/1gKxzGWvnoCpXPoe8zzfLnQ 提取码:5lyf 二 安装 https://www.jb51.net/softs/598 ...
- webpack 多环境打包
目前来说有两种方案: 方案一: 1.修改build文件夹下build.js文件 添加声明变量 2.修改config文件夹下dev.env.js文件 这个是开发环境所用版本 3.修改config文件夹下 ...
- IE8和IE9下textarea滚动选中的问题
在IE8和IE9下如果textarea设置了样式overflow-y:auto;就不可以滚动选中了,应该样式写成overflow:auto;有了纵向滚动实际上就不会出现横向滚动的情况,也没有必要ove ...
- stm32单片机利用ntc热敏电阻温度转换公式C语言版
首先 我们需要明确电路结构 热敏电阻的原理就不再赘述,本文不凑字数,只讲干货 必须要知道的就是串联电阻R9程序中定义为resistanceInSeries ,精度越高越好 为了方便,先在程序中定义好你 ...
- MATLAB中插值算法实现
%%%1.M文件%(1).以往少的程序可以在命令行窗口进行编码,但大量的程序编排到命令行窗口,%会有造成乱码的危险.(2).如果将命令编成程序存储在一个文件中(M文件),依次运行文件中的命令,则可以重 ...
- 【刷题-LeetCode】236. Lowest Common Ancestor of a Binary Tree
Lowest Common Ancestor of a Binary Tree Given a binary tree, find the lowest common ancestor (LCA) o ...
- golang取地址操作采坑:for idx,item := range arr中的item是个独立对象
先看代码: package main import "fmt" func main() { type s struct { A string B int32 } arr := [] ...
- NTT 快速数论变换
NTT 先学习FFT 由于FFT是使用复数运算,精度并不好,而且也无法取模,所以有了NTT(快速数论变换). 建议先完全理解FFT后再学习NTT. 原根 NTT使用与单位根性质相似的原根来代替单位根. ...
- 线程同步介绍及 生产者消费者问题举例 C#版
现在有五个工人在果园摘水果,一次只能摘一个,摘下的水果放入一个框中,这种框最多只能装50个橘子,一共有两个这样的框.当一个工人装框时,其他工人不能在使用这个框.当两个框都装满了,工人只有等框里有剩余位 ...
- centos7无法访问虚拟机web服务
第一种: 先看下防火墙状态:firewall-cmd --state 关闭防火墙再试试:systemctl stop firewalld.service 第二种,不想关闭防火墙 放开http服务 fi ...