基于dynamic的Druid 与 HikariCP 连接池集成配置区别

发布于:2025-08-10 ⋅ 阅读:(31) ⋅ 点赞:(0)

你提供的内容是关于 ​​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_master
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave:
          url: jdbc:mysql://localhost:3307/db_slave
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
连接池配置示例(以 HikariCP 为例):
spring:
  datasource:
    dynamic:
      datasource:
        master:
          hikari:
            maximum-pool-size: 20
            minimum-idle: 5
            connection-timeout: 30000
Druid 配置示例:
spring:
  datasource:
    dynamic:
      datasource:
        master:
          type: com.alibaba.druid.pool.DruidDataSource
          druid:
            initial-size: 5
            max-active: 20
            filters: stat,wall,log4j
            validation-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,metrics
  metrics:
    tags:
      application: ${spring.application.name}

访问指标:
http://localhost:8080/actuator/metrics/hikaricp.connections.active

Druid 监控:
spring:
  datasource:
    dynamic:
      datasource:
        master:
          druid:
            stat-view-servlet:
              enabled: true
              url-pattern: /druid/*
              allow: 127.0.0.1

访问地址::8080/druid


📌 使用建议 & 最佳实践

场景 推荐方案
​高并发、追求性能​ 使用 ​​HikariCP​​,配置合理的 maximum-pool-size(如 20~50,视机器配置而定)
​需要 SQL 防火墙、加密、监控​ 使用 ​​Druid​​,但注意配置复杂、启动慢
​读写分离​ 可使用 @DS 注解或配置多数据源组,结合负载均衡策略
​分布式事务​ 可集成 ​​Seata​​,或使用本地事务方案
​动态增删数据源​ 使用提供的 API 动态注册/注销数据源,适合多租户等场景

⚠️ 注意事项

  1. ​JPA 不推荐使用本组件​​,因 JPA 自身事务管理机制与动态数据源切换存在冲突。
  2. ​不要同时使用 HikariCP 和 Druid​​,否则易出现 NoClassDefFoundError 等问题。
  3. ​方法上的 @DS 注解优先级高于类上​​。
  4. ​DS 注解支持继承,但仅限于抽象类,不支持接口继承。​
  5. ​默认主数据源是 master,可通过 spring.datasource.dynamic.primary 修改。​

📚 总结

​dynamic-datasource-spring-boot-starter​​ 是一个功能全面、扩展灵活、适用于生产环境的多数据源管理组件,特别适合以下业务场景:

  • 多租户系统(每个租户独立库)
  • 读写分离架构
  • 数据分片/多库并行
  • 需要动态切换数据源的微服务模块
  • 需要高度自定义数据源配置与管理的系统

网站公告

今日签到

点亮在社区的每一天
去签到