你提供的內容是關于 ??dynamic-datasource-spring-boot-starter?? 的詳細介紹,這是一個非常實用的 ??Spring Boot 多數據源動態切換組件??,適用于需要在單個應用中連接多個數據庫并靈活切換數據源的場景。下面我為你梳理一下該組件的核心信息與使用要點,方便你快速理解與應用:
📦 組件簡介
??dynamic-datasource-spring-boot-starter?? 是一個基于 Spring Boot 的 ??多數據源動態切換啟動器??,支持:
- ??Spring Boot 1.5.x、2.x.x、3.x.x??
- ??JDK 1.7+??
?? ??注意:JPA 用戶不建議使用本組件,因為 JPA 自帶事務管理,難以實現數據源的動態切換。??
? 核心特性
特性 | 說明 |
---|---|
??多數據源支持?? | 支持純粹多庫、讀寫分離、一主多從、混合模式等 |
??數據源分組?? | 可將多個數據源歸為一組,如讀庫組、寫庫組,支持負載均衡 |
??敏感信息加密?? | 支持數據庫密碼等敏感配置加密,如 ENC(...),可自定義加密策略 |
??懶加載 & 無數據源啟動?? | 支持按需加載數據源,應用啟動時可以不加載所有數據源 |
??自定義數據源來源?? | 支持從數據庫或其他方式動態加載數據源配置 |
??動態增刪數據源?? | 支持運行時動態添加或移除數據源 |
??注解驅動切換?? | 通過 @DS 注解(可繼承)靈活指定數據源,支持類/方法級別 |
??多數據源事務?? | 提供本地多數據源事務方案,也支持集成 Seata 分布式事務 |
??支持多種連接池?? | Druid(推薦監控)、HikariCP(推薦性能)、BeeCP、DBCP2、JNDI 等 |
??SpEL 動態參數解析?? | 支持基于 SpEL、Session、Header 等動態選擇數據源,可擴展 |
??多層嵌套切換?? | 支持 Service 層方法間多次數據源切換(A → B → C) |
??MyBatis / MyBatis-Plus 友好?? | 提供與 MyBatis 及 MyBatis-Plus 的良好集成 |
??Quartz / ShardingSphere / P6Spy 等兼容?? | 提供對這些常用組件的集成方案 |
🛠? 使用方法
1. 引入依賴
Spring Boot 3.x 推薦:
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot3-starter</artifactId><version>4.2.0</version>
</dependency>
如需使用 Druid 連接池(可選):
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.18</version>
</dependency>
?? 注意:不要同時引入 HikariCP 和 Druid,避免沖突。
2. 配置數據源(application.yml)
基礎配置示例:
spring:datasource:dynamic:primary: master # 默認數據源strict: false # 未找到數據源是否拋異常datasource:master:url: jdbc:mysql://localhost:3306/db_masterusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverslave:url: jdbc:mysql://localhost:3307/db_slaveusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
連接池配置示例(以 HikariCP 為例):
spring:datasource:dynamic:datasource:master:hikari:maximum-pool-size: 20minimum-idle: 5connection-timeout: 30000
Druid 配置示例:
spring:datasource:dynamic:datasource:master:type: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 5max-active: 20filters: stat,wall,log4jvalidation-query: SELECT 1
3. 使用 @DS 注解切換數據源
類級別 + 方法級別覆蓋:
@Service
@DS("slave") // 默認使用 slave 數據源
public class UserService {@DS("master") // 此方法使用 master 數據源public User getMasterData() {// ...}public User getSlaveData() {// 使用類上配置的 slave 數據源}
}
手動切換(編程式):
// 切換到 slave 數據源
DynamicDataSourceContextHolder.push("slave");try {// 執行操作,如調用 Mapper/DAO
} finally {// 恢復默認數據源DynamicDataSourceContextHolder.poll();
}
🧩 高級功能
1. 動態數據源擴展
你可以編程方式動態添加數據源,比如從數據庫加載配置后動態注冊:
@Bean
public DataSource dynamicDataSource(DataSourceProperties properties) {DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();dataSource.addDataSource("custom", createDataSource("jdbc:mysql://custom-db:3306/db"));return dataSource;
}private DataSource createDataSource(String url) {DriverManagerDataSource ds = new DriverManagerDataSource();ds.setUrl(url);ds.setUsername("root");ds.setPassword("123456");return ds;
}
2. 監控
HikariCP 監控(推薦):
通過 Actuator 查看連接池狀態:
management:endpoints:web:exposure:include: health,metricsmetrics:tags:application: ${spring.application.name}
訪問指標:
http://localhost:8080/actuator/metrics/hikaricp.connections.active
Druid 監控:
spring:datasource:dynamic:datasource:master:druid:stat-view-servlet:enabled: trueurl-pattern: /druid/*allow: 127.0.0.1
訪問地址::8080/druid
📌 使用建議 & 最佳實踐
場景 | 推薦方案 |
---|---|
??高并發、追求性能?? | 使用 ??HikariCP??,配置合理的 maximum-pool-size (如 20~50,視機器配置而定) |
??需要 SQL 防火墻、加密、監控?? | 使用 ??Druid??,但注意配置復雜、啟動慢 |
??讀寫分離?? | 可使用 @DS 注解或配置多數據源組,結合負載均衡策略 |
??分布式事務?? | 可集成 ??Seata??,或使用本地事務方案 |
??動態增刪數據源?? | 使用提供的 API 動態注冊/注銷數據源,適合多租戶等場景 |
?? 注意事項
- ??JPA 不推薦使用本組件??,因 JPA 自身事務管理機制與動態數據源切換存在沖突。
- ??不要同時使用 HikariCP 和 Druid??,否則易出現
NoClassDefFoundError
等問題。 - ??方法上的 @DS 注解優先級高于類上??。
- ??DS 注解支持繼承,但僅限于抽象類,不支持接口繼承。??
- ??默認主數據源是 master,可通過 spring.datasource.dynamic.primary 修改。??
📚 總結
??dynamic-datasource-spring-boot-starter?? 是一個功能全面、擴展靈活、適用于生產環境的多數據源管理組件,特別適合以下業務場景:
- 多租戶系統(每個租戶獨立庫)
- 讀寫分離架構
- 數據分片/多庫并行
- 需要動態切換數據源的微服務模塊
- 需要高度自定義數據源配置與管理的系統