当前位置: 首页 > news >正文

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

你提供的内容是关于 ​​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 动态注册/注销数据源,适合多租户等场景

⚠️ 注意事项

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

📚 总结

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

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

相关文章:

  • Web自动化技术选择
  • [Oracle] TRUNC()函数
  • 11. 为什么要用static关键字
  • Qt Graphics View框架概述
  • SpringBoot日志关系
  • 分治-快排-面试题 17.14.最小k个数-力扣(LeetCode)
  • 【Datawhale AI夏令营】让AI读懂财报PDF(多模态RAG)(Task 2)
  • 【无标题】六边形结构在二维拓扑量子色动力学模型中确实具有独特优势,并构建完整的二维拓扑量子色动力学模型。
  • QToolBar 的 addPermanentWidget() 详解与实战场景
  • Python如何将图片转换为PDF格式
  • [SC]SystemC 常见的编译/语法错误与解法(三)
  • PowerShell 入门系列(五):运行命令与命令剖析详解
  • Effective C++ 条款32:确定你的public继承塑模出 is-a 关系
  • pytorch+tensorboard+可视化CNN
  • ubuntu dpkg命令使用指南
  • 【线性代数】其他
  • 机器翻译实战:使用Gensim训练中英文词向量模型及可视化
  • leetcode-C语言-3479.水果成篮 III
  • 写 SPSS文件系统
  • Linux软件编程:shell
  • 组合期权:垂直价差
  • C++ 中的智能指针
  • 电子电气架构 --- 电气/电子架构迁移已拉开帷幕
  • Oracle数据库重启后打开异常状态的检查步骤
  • 一周学会Matplotlib3 Python 数据可视化-网格 (Grid)
  • [IOMMU]面向芯片/SoC验证工程的IOMMU全景速览
  • C# 通过第三方库INIFileParser管理INI配置文件
  • 智慧园区误报率↓76%:陌讯多模态融合算法实战解析
  • 202506 电子学会青少年等级考试机器人一级理论综合真题
  • 闲鱼智能监控机器人:基于 Playwright 与 AI 的多任务监控分析工具