解讀動(dòng)態(tài)數(shù)據(jù)源dynamic-datasource-spring-boot-starter使用問(wèn)題
dynamic-datasource-spring-boot-starter使用
dynamic-datasource-spring-boot-starter ??是一個(gè)基于springboot的快速集成多數(shù)據(jù)源的啟動(dòng)器。
其支持Jdk 1.7+, SpringBoot 1.5.x 和 2.x.x。
特性
- 支持?jǐn)?shù)據(jù)源分組,適用于多種場(chǎng)景 純粹多庫(kù) 讀寫(xiě)分離 一主多從 混合模式。
- 支持?jǐn)?shù)據(jù)庫(kù)敏感配置信息加密ENC()。
- 支持每個(gè)數(shù)據(jù)庫(kù)獨(dú)立初始化表結(jié)構(gòu)schema和數(shù)據(jù)庫(kù)database。
- 支持自定義注解,需繼承DS(3.2.0+)。
- 提供對(duì)Druid,Mybatis-Plus,P6sy,Jndi的快速集成。
- 簡(jiǎn)化Druid和HikariCp配置,提供全局參數(shù)配置。配置一次,全局通用。
- 提供自定義數(shù)據(jù)源來(lái)源方案。
- 提供項(xiàng)目啟動(dòng)后動(dòng)態(tài)增加移除數(shù)據(jù)源方案。
- 提供Mybatis環(huán)境下的純讀寫(xiě)分離方案。
- 提供使用spel動(dòng)態(tài)參數(shù)解析數(shù)據(jù)源方案。內(nèi)置spel,session,header,支持自定義。
- 支持多層數(shù)據(jù)源嵌套切換。(ServiceA >>> ServiceB >>> ServiceC)。
- 提供對(duì)shiro,sharding-jdbc,quartz等第三方庫(kù)集成的方案,注意事項(xiàng)和示例。
- 提供**基于seata的分布式事務(wù)方案。**附:不支持原生spring事務(wù)。
- 提供**本地多數(shù)據(jù)源事務(wù)方案。**附:不支持原生spring事務(wù)。
約定
- 本框架只做切換數(shù)據(jù)源這件核心的事情。
- 配置文件所有以下劃線(xiàn)_分割的數(shù)據(jù)源首部即為組的名稱(chēng),相同組名稱(chēng)的數(shù)據(jù)源會(huì)放在一個(gè)組下。
- 切換數(shù)據(jù)源可以是組名,也可以是具體數(shù)據(jù)源名稱(chēng)。組名則切換時(shí)采用負(fù)載均衡算法切換。
- 默認(rèn)的數(shù)據(jù)源名稱(chēng)為master,你可以通過(guò)spring.datasource.dynamic.primary修改。
- 方法上的注解優(yōu)先于類(lèi)上注解。
使用方法
引入dynamic-datasource-spring-boot-starter。
![]()
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
配置數(shù)據(jù)源。
spring:
datasource:
dynamic:
primary: master #設(shè)置默認(rèn)的數(shù)據(jù)源或者數(shù)據(jù)源組,默認(rèn)值即為master
strict: false #設(shè)置嚴(yán)格模式,默認(rèn)false不啟動(dòng). 啟動(dòng)后在未匹配到指定數(shù)據(jù)源時(shí)候會(huì)拋出異常,不啟動(dòng)則使用默認(rèn)數(shù)據(jù)源.
datasource:
master:
url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver # 3.2.0開(kāi)始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_2:
url: ENC(xxxxx) # 內(nèi)置加密,使用請(qǐng)查看詳細(xì)文檔
username: ENC(xxxxx)
password: ENC(xxxxx)
driver-class-name: com.mysql.jdbc.Driver
schema: db/schema.sql # 配置則生效,自動(dòng)初始化表結(jié)構(gòu)
data: db/data.sql # 配置則生效,自動(dòng)初始化數(shù)據(jù)
continue-on-error: true # 默認(rèn)true,初始化失敗是否繼續(xù)
separator: ";" # sql默認(rèn)分號(hào)分隔符
#......省略
#以上會(huì)配置一個(gè)默認(rèn)庫(kù)master,一個(gè)組slave下有兩個(gè)子庫(kù)slave_1,slave_2
# 多主多從 純粹多庫(kù)(記得設(shè)置primary) 混合配置
spring: spring: spring:
datasource: datasource: datasource:
dynamic: dynamic: dynamic:
datasource: datasource: datasource:
master_1: mysql: master:
master_2: oracle: slave_1:
slave_1: sqlserver: slave_2:
slave_2: postgresql: oracle_1:
slave_3: h2: oracle_2:
使用**@DS**切換數(shù)據(jù)源。
@DS可以注解在方法上或類(lèi)上,同時(shí)存在就近原則 方法上注解 優(yōu)先于 類(lèi)上注解。
| 注解 | 結(jié)果 |
|---|---|
| 沒(méi)有@DS | 默認(rèn)數(shù)據(jù)源 |
| @DS("dsName") | dsName可以為組名也可以為具體某個(gè)庫(kù)的名稱(chēng) |
@Service
@DS("slave")
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public List selectAll() {
return jdbcTemplate.queryForList("select * from user");
}
@Override
@DS("slave_1")
public List selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
}
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Spring實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的方法總結(jié)
- Springboot實(shí)現(xiàn)根據(jù)用戶(hù)ID切換動(dòng)態(tài)數(shù)據(jù)源
- 如何在Java SpringBoot項(xiàng)目中配置動(dòng)態(tài)數(shù)據(jù)源你知道嗎
- Spring AbstractRoutingDatasource 動(dòng)態(tài)數(shù)據(jù)源的實(shí)例講解
- 詳解SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換
- Spring中的動(dòng)態(tài)數(shù)據(jù)源解讀
相關(guān)文章
子線(xiàn)程任務(wù)發(fā)生異常時(shí)主線(xiàn)程事務(wù)回滾示例過(guò)程
這篇文章主要為大家介紹了子線(xiàn)程任務(wù)發(fā)生了異常時(shí)主線(xiàn)程事務(wù)如何回滾的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Spring MVC---數(shù)據(jù)綁定和表單標(biāo)簽詳解
本篇文章主要介紹了Spring MVC---數(shù)據(jù)綁定和表單標(biāo)簽詳解,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
Springmvc ajax跨域請(qǐng)求處理方法實(shí)例詳解
這篇文章主要介紹了Springmvc ajax跨域請(qǐng)求處理方法實(shí)例詳解,需要的朋友可以參考下2017-10-10
java開(kāi)源調(diào)度如何給xxljob加k8s執(zhí)行器
這篇文章主要介紹了java開(kāi)源調(diào)度如何給xxljob加一個(gè)k8s執(zhí)行器,?xxljob?在設(shè)計(jì)上,抽象出了執(zhí)行器的接口,所以實(shí)現(xiàn)一個(gè)語(yǔ)言的執(zhí)行器并不復(fù)雜,這里主要探索下,如何利用k8s的pod?的能力,使用?xxljob?調(diào)度?pod?運(yùn)行,實(shí)現(xiàn)一個(gè)通用的和語(yǔ)言無(wú)關(guān)的執(zhí)行器2022-02-02
Java Spring處理循環(huán)依賴(lài)詳解
這篇文章主要介紹了Java中的Spring如何處理循環(huán)依賴(lài),依賴(lài)指的是Bean與Bean之間的依賴(lài)關(guān)系,關(guān)于更多Spring?處理循環(huán)依賴(lài)的詳情,需要的朋友可以參考下面文章具體內(nèi)容2023-04-04
springboot使用spring-data-jpa操作MySQL數(shù)據(jù)庫(kù)
這篇文章主要介紹了springboot使用spring-data-jpa操作MySQL數(shù)據(jù)庫(kù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
java.lang.IllegalStateException異常解決
異常是程序在執(zhí)行過(guò)程中遇到的錯(cuò)誤或異常情況,本文就來(lái)介紹一下java.lang.IllegalStateException異常解決,感興趣的可以了解一下2023-11-11

