之前的項目中,要做多數據源,網上的一般思路都是通過AOP
在service或者mapper層做數據源的動態切換,大部分人大概切換數據源代碼如下
@Pointcut("execution(* com.gzstrong.cloud.qspj.*.mapper..*.*(..))")
private void db1Aspect() {
}
@Pointcut("execution(* com.gzstrong.cloud.qspj.interfc.mapper..*.*(..))")
private void db2Aspect() {
}
@Before( "db1Aspect()" )
public void db1(JoinPoint joinPoint) {
log.info("切換到db1 數據源...");
setDataSource(joinPoint,DBTypeEnum.db1);
}
@Before("db2Aspect()" )
public void db2 (JoinPoint joinPoint) {
log.info("切換到db2 數據源...");
setDataSource(joinPoint,DBTypeEnum.db2);
}
如果你用了mybatis-plus的,切換數據源就更簡單了,下面是官方介紹
特性
- 數據源分組,適用於多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
- 內置敏感參數加密和啓動初始化表結構schema數據庫database。
- 提供對Druid,Mybatis-Plus,P6sy,Jndi的快速集成。
- 簡化Druid和HikariCp配置,提供全局參數配置。
- 提供自定義數據源來源接口(默認使用yml或properties配置)。
- 提供項目啓動後增減數據源方案。
- 提供Mybatis環境下的 純讀寫分離 方案。
- 使用spel動態參數解析數據源,如從session,header或參數中獲取數據源。(多租戶架構神器)
- 提供多層數據源嵌套切換。(ServiceA >>> ServiceB >>> ServiceC,每個Service都是不同的數據源)
- 提供 不使用註解 而 使用 正則 或 spel 來切換數據源方案(實驗性功能)。
約定
- 本框架只做 切換數據源 這件核心的事情,並不限制你的具體操作,切換了數據源可以做任何CRUD。
- 配置文件所有以下劃線
_
分割的數據源 首部 即爲組的名稱,相同組名稱的數據源會放在一個組下。 - 切換數據源可以是組名,也可以是具體數據源名稱。組名則切換時採用負載均衡算法切換。
- 默認的數據源名稱爲 master ,你可以通過
spring.datasource.dynamic.primary
修改。 - 方法上的註解優先於類上註解。
下面是Mybatis-plus的多數據源的具體代碼
1,加入相關引入jar
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.7</version>
</dependency>
2,配置多個數據源
spring: datasource: dynamic: primary: master #設置默認的數據源或者數據源組,默認值即爲master datasource: master: username: root password: admin driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/ds_0?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT slave_1: username: root password: admin driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/ds_1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
就這2步就可以了,簡不簡單,當你需要操作master庫時,
系統默認指向master庫,當你需要操作slave_1庫時,
類或者方法前加入@DS("slave_1")
簡單吧,如果對你有用的話,方便點個贊,謝謝