你提供的内容是关于 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 是一个功能全面、扩展灵活、适用于生产环境的多数据源管理组件,特别适合以下业务场景:
- 多租户系统(每个租户独立库)
- 读写分离架构
- 数据分片/多库并行
- 需要动态切换数据源的微服务模块
- 需要高度自定义数据源配置与管理的系统