SpringBoot(AOP+⾃定义注解)动态多数据源切换实现⾮动态数据源⽅式
思路
在配置⽂件中填写多数据源信息
在接⼝上使⽤@DS即可
实操
1. 这⾥的配置使⽤的是yml⽂件,主要的配置就是datasource,别的配置都是陪衬。
配置⽂件⽰例:
server:
port:2080
logging:
level:
org.springframework.web: debug
org.springframework.data: debug
mybatis-plus:
executor-type: simple
spring:
datasource:
#配置hikari连接池
hikari:
minimum-idle:4
maximum-pool-size:16
connection-timeout:10000
idle-timeout:30000
connection-init-sql: set names utf8mb4
#动态数据源配置
dynamic:
#主数据源
primary: a01
datasource:
#数据源a01
a01:
driver-class-name: sql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/a01?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password:123456
#数据源a02
a02:
driver-class-name: sql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/a02?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password:123456
#数据源a03
a03:
driver-class-name: sql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/a03?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password:123456
这⾥需要注意⼀个问题,就是primary配置是必填项,这个作为全局的默认数据源。
每个数据源可以是不同机器上⾯的不同的数据库实例。例⼦中给的配置只是⼀个demo,所以是同⼀个MySQL实例的三个库⽽已,虽然简单,但是道理是⼀样的。
配置完成之后,我们可以通过启动程序看⽇志打印来查看是否配置成功。
⽇志⽰例:
中间红⾊⽅框的内容就是我们多数据源的加载信息。
2. 这⾥我们新建三个不⽤的Mapper⽂件,每个Mapper⽂件对应⼀个数据源,我们通过调⽤不同的Mapper⽂件中的⽅法来实现查询不同的数据库中的数据
@DS(value ="a01")
@Mapper
public interface MapperA01 extends BaseMapper<UserInfo>{
@Select("SELECT * FROM user_info")
List<UserInfo>getAllUser();
}
@DS(value ="a02")
@Mapper
springboot aoppublic interface MapperA02 extends BaseMapper<UserInfo>{
@Select("SELECT * FROM user_info")
List<UserInfo>getAllUser();
}
@DS(value ="a03")
@Mapper
public interface MapperA03 extends BaseMapper<UserInfo>{
@Select("SELECT * FROM user_info")
List<UserInfo>getAllUser();
}
AOP + ⾃定义注解实现动态多数据源切换
思路
由于tomcat初始化线程来处理请求,所以我们可以利⽤这个特性为每个线程创建对应的ThreadLocal
我们在程序⾥⾯继承AbstractRoutingDataSource() 通过⼀个key→datasource,拿到的connection不同就可以去不同的库中拿数据请求时是不知道你的请求被哪条线程来处理的,所以程序初始化时候就要存储DataSource即数据源,因此需要将数据源信息保存在⼀个主库中,每次请求的数据源信息从数据库中得到

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。