一個基於springboot的快速集成動態多數據源的啓動器
簡介
dynamic-datasource-spring-boot-starter 是一個基於com.baomidou二次開發的springboot的快速集成多數據源的啓動器。
其支持 Jdk 1.8+, SpringBoot 1.4.x 1.5.x 2.0.x。
特性
- 數據源分組,適用於多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
- 內置敏感參數加密和啓動初始化表結構schema數據庫database。
- 提供對Druid,Mybatis-Plus,P6sy,Jndi的快速集成。
- 簡化Druid和HikariCp配置,提供全局參數配置。
- 提供自定義數據源來源接口(默認使用yml或properties配置)。
- 提供項目啓動後增減數據源方案。
- 提供Mybatis環境下的 純讀寫分離 方案。
- 使用spel動態參數解析數據源,如從session,header或參數中獲取數據源。(多租戶架構神器)
- 提供多層數據源嵌套切換。(ServiceA >>> ServiceB >>> ServiceC,每個Service都是不同的數據源)
- 提供 不使用註解 而 使用 正則 或 spel 來切換數據源方案(實驗性功能)。
使用方法
- 引入dynamic-datasource-spring-boot-starter。
<dependency>
<groupId>cn.humingfeng</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
- 配置數據源。
spring:
datasource:
dynamic:
primary: master #設置默認的數據源或者數據源組,默認值即爲master
strict: false #設置嚴格模式,默認false不啓動. 啓動後在未匹配到指定數據源時候回拋出異常,不啓動會使用默認數據源.
datasource:
master:
url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
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) # 內置加密,使用請查看詳細文檔
username: ENC(xxxxx)
password: ENC(xxxxx)
driver-class-name: com.mysql.jdbc.Driver
schema: db/schema.sql # 配置則生效,自動初始化表結構
data: db/data.sql # 配置則生效,自動初始化數據
continue-on-error: true # 默認true,初始化失敗是否繼續
separator: ";" # sql默認分號分隔符
#......省略
#以上會配置一個默認庫master,一個組slave下有兩個子庫slave_1,slave_2
# 多主多從 純粹多庫(記得設置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 切換數據源。
@DS 可以註解在方法上和類上,同時存在方法註解優先於類上註解。
強烈建議只註解在service實現上。
註解 | 結果 |
---|---|
沒有@DS | 默認數據源 |
@DS(“dsName”) | dsName可以爲組名也可以爲具體某個庫的名稱 |
@Service
@DS("slave")
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Map<String, Object>> selectAll() {
return jdbcTemplate.queryForList("select * from user");
}
@Override
@DS("slave_1")
public List<Map<String, Object>> selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
}
}
PS:最新的1.2.0版本支持:
現在啓動時會在從配置文件中初始化數據源後再從默認數據庫表中初始化其他數據源,如果數據源表不存在會自動建表,如果存在則從配置表中讀取其他數據源配置信息,並進行初始化。
*MysqlDynamicDataSourceProvider爲新增類
*data_source_config 爲數據源配置表,不需要手動建,表不存在會自動創建
*表中字段爲
USER_NAME varchar(255) ‘用戶名’,
PASSWORD varchar(255) ‘密碼’,
URL varchar(255) ‘地址’,
DRIVER_CLASS_NAME ‘驅動’,
DB_NAME ‘數據源名稱’,
TYPE ‘數據源類型’,
==> TYPE內容支持內容:1、com.alibaba.druid.pool.DruidDataSource
2、com.alibaba.druid.pool.DruidDataSource
3、空,則自動創建BasicDataSource
默認庫如果非MySQL或者Oracle,需要改動建表語句自己打包
歡迎STAR,並關注
關注Github:1/2極客
關注博客:御前提筆小書童
關注網站:HuMingfeng
關注公衆號:開發者的花花世界