当前位置: 首页 > 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.dtcms.com/a/323370.html

相关文章:

  • 论文阅读 2025-8-3 [FaceXformer, RadGPT , Uni-CoT]
  • 数论——约数之和、快速乘
  • 新手入门:Git 初次配置与 Gitee 仓库操作全指南 —— 从环境搭建到代码推送一步到位
  • 【unitrix数间混合计算】2.9 小数部分特征(t_non_zero_bin_frac.rs)
  • Java基础-完成局域网内沟通软件的开发
  • day 16 stm32 IIC
  • day 35_2025-08-09
  • 202506 电子学会青少年等级考试机器人四级器人理论真题
  • Java -- 日期类-第一代-第二代-第三代日期
  • 05.【数据结构-C语言】栈(先进后出,栈的实现:进栈、出栈、获取栈顶元素,栈实现代码,括号匹配问题)
  • 分布式事务Seata TCC模式篇
  • 【代码篇】关于PartiallyPassword插件_实现文章加密
  • 不同类型模型的样本组织形式
  • 机器翻译:FastText算法详解与Python的完整实现
  • Java-线程线程的创建方式
  • 十九、MySQL-DQL-基本查询
  • 校招秋招春招实习快手在线测评快手测评题库|测评解析和攻略|题库分享
  • 【unitrix数间混合计算】2.10 小数部分特征(bin_frac.rs)
  • 【和春笋一起学C++】(三十三)名称空间的其他特性
  • 小米开源大模型 MiDashengLM-7B:不仅是“听懂”,更能“理解”声音
  • B.10.01.5-电商系统的设计模式应用实战
  • 制作浏览器CEFSharp133+X86+win7 之 javascript交互(二)
  • Javaweb - 14.1 - 前端工程化
  • 从依赖外部提示的显式思维链(CoT),到内部自洽的内化推理(Internalized Reasoning)
  • ConcurrentHashMap源码详解
  • 虚拟手机号工具使用
  • 年轻新标杆!东方心绣脸韧带年轻技术升级发布
  • 基于大语言模型的智能问答系统研究
  • 谷歌官方性能文档:Android 动态性能框架优化Performance Hint API
  • Go 实用指南:如何执行 Skyline 查询(Pareto 最优点筛选)