基于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.pswp.cn/news/918092.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法训练之栈

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

OpenAI 最新开源模型 gpt-oss (Windows + Ollama/ubuntu)本地部署详细教程

OpenAI 最近发布了其首个开源的开放权重模型gpt-oss&#xff0c;这在AI圈引起了巨大的轰动。对于广大开发者和AI爱好者来说&#xff0c;这意味着我们终于可以在自己的机器上&#xff0c;完全本地化地运行和探索这款强大的模型了。 本教程将一步一步指导你如何在Windows系统上&…

在X86架构Linux中创建虚拟根目录并下载指定架构(如aarch64)的软件包(含依赖)

在X86架构Linux中创建虚拟根目录并下载指定架构(如aarch64)的软件包(含依赖) 在Linux系统中&#xff0c;有时候我们需要在特定的环境或架构下安装软件包&#xff0c;而不影响主系统。一种常见的方法是创建一个虚拟的根目录&#xff0c;并在此环境中操作。本文将介绍如何通过创建…

scratch笔记和练习-第9课:一起来绘画

位图也称为点阵图&#xff0c;它是由许许多多的点组成的&#xff0c;这些点被称为像素。位图图像可以表现丰富的多彩变化 并产生逼真的效果&#xff0c;很容易在不同软件之间交换使用&#xff0c; 但它在保存图像时需要记录每一个像素的色彩信息&#xff0c;所以占用的存储空间…

[linux] Linux:一条指令更新DDNS

Linux&#xff1a;一条指令更新DDNS 在动态IP环境下&#xff0c;如何确保我们的域名始终指向正确的公网IP地址&#xff1f;动态DNS&#xff08;DDNS&#xff09;服务为我们提供了完美的解决方案。今天&#xff0c;我将分享一个简洁高效的Linux命令行指令&#xff0c;用于自动更…

[激光原理与应用-182]:测量仪器 - 光束型 - 光束质量分析仪

光束质量分析仪是用于精确评估激光光束特性的核心设备&#xff0c;通过测量光束的强度分布、相位分布、发散角等参数&#xff0c;为激光系统的优化、加工工艺控制及科研实验提供关键数据支持。以下是光束质量分析仪的详细解析&#xff1a;一、核心功能 - 光束强度分布分析测量内…

Linux 限制 root 登录 IP 地址的方法

Linux 限制 root 登录 IP 地址的方法Linux 限制 root 登录 IP 地址的方法方法一&#xff1a;修改 SSH 配置文件方法二&#xff1a;使用 hosts.allow 和 hosts.deny 文件方法三&#xff1a;使用防火墙规则方法四&#xff1a;使用 access.conf 文件注意事项Linux 限制 root 登录 …

Word中怎样插入特殊符号

使用 “插入” 菜单&#xff1a;插入常用符号&#xff1a;将光标置于要插入符号的位置&#xff0c;点击 “插入” 选项卡&#xff0c;在 “符号” 组中点击 “符号” 按钮&#xff0c;会弹出一个符号库&#xff0c;里面包含了常见的标点符号、特殊字符等&#xff0c;找到所需符…

Linux 内核发包流程与路由控制实战

Linux 内核发包流程与路由控制实战 在网络调优、性能优化、SDN、NFV、容器网络等场景下&#xff0c;理解 Linux 内核发包路径和路由控制机制是必修课。 本文将从内核网络栈的原理入手&#xff0c;再结合 iproute2 命令和 策略路由给出实战案例。一、Linux 内核发包流程&#xf…

点播服务器

早期的时候&#xff0c;用 live555 作为 rtsp 点播服务器&#xff1b;现在比较常用的 流媒体服务器比较多&#xff1b;这里比较简单的&#xff0c;可以用 ZLMediakit&#xff1b;可以支持 ffmeg 退流 到ZLMediakit&#xff0c;然后别的客户端从 ZLMediakit 服务器拉流&#xff…

分享超图提供的、很不错的WebGIS学习资源

最近在学习了解Supermap iclient&#xff0c;发现官方提供的帮助文档、GIS学堂真的不错&#xff0c;解释了很多的内容。 官方modern-web-gis-in-action文档的网址如下&#xff1a;https://iclient.supermap.io/web/books/modern-web-gis-in-action/&#xff0c;在其中介绍了现代…

通信算法之298: verilog语法generate和for介绍

在 Verilog 中&#xff0c;generate和for是实现参数化设计和模块实例化复用的重要工具&#xff0c;尤其在需要根据参数动态生成逻辑时非常有用。以下是它们的使用方法和区别&#xff1a;1. for循环&#xff08;过程块内&#xff09;for循环主要用于过程块&#xff08;always/in…

laravel在cli模式下输出格式漂亮一些

在 Laravel 的 CLI 模式下&#xff0c;可以通过以下方式让命令行输出更加美观和专业&#xff1a; 1. 使用 Artisan 输出助手方法 Laravel 提供了多种输出样式方法&#xff1a; public function handle() {// 基础样式$this->info(成功信息 - 绿色); // 绿色$this->err…

大数据管理与应用学什么?就业前景怎么样?

前言在数字经济蓬勃发展的今天&#xff0c;大数据已经成为推动社会进步的核心生产要素。大数据管理与应用作为新兴交叉学科&#xff0c;正受到越来越多学生和企业的关注。本文将全面剖析该专业的课程体系、核心技能要求&#xff0c;详细介绍CDA数据分析师认证的备考策略&#x…

mac笔记本如何重新设置ssh key

要在Mac上重新生成SSH密钥并将其添加到平台&#xff0c;可以按照以下步骤操作&#xff1a; 打开终端 在Mac上&#xff0c;你可以通过Spotlight搜索&#xff08;按Command Space&#xff09;输入Terminal来打开终端或者直接搜索终端检查现有SSH密钥 首先&#xff0c;检查是否已…

Godot ------ 通过鼠标对节点进行操作

Godot ------ 通过鼠标对节点进行操作 引言 正文 引言 对于一个游戏,通过鼠标对游戏对象进行操作是非常普遍的行为,本文我们将以 Control 节点进行举例,说明如何通过鼠标对 Control 节点进行移动操作。 正文 首先,我们创建一个 Contorl 节点,并将它的 Layout->Trans…

k8s 网络插件 flannel calico

一、k8s 网络概述 Kubernetes网络是指在Kubernetes集群中不同组件之间进行通信和交互的网络架构&#xff0c;每个容器都有自己的IP地址&#xff0c;这些容器组成了Pod&#xff0c;Pod是Kubernetes调度的最小单元。 Pod是Kubernetes中最小的部署单元&#xff0c;每个Pod都有一个…

易美教育荣膺“腾讯年度影响力国际教育品牌”双奖加冕,见证中国国际教育力量的崛起

【腾讯新闻&#xff0c;北京讯】在刚刚圆满落幕的“回响中国”腾讯新闻教育频道年度论坛上&#xff0c;国际教育领域迎来了高光时刻&#xff1a;以美国华尔街为总部、深耕国际教育十余年的易美教育&#xff08;Easymay&#xff09;&#xff0c;凭借其持续创新的教育模式、国际化…

Chrome与Firefox浏览器安全运维配置命令大全:从攻防到优化的专业实践

Chrome与Firefox浏览器安全运维配置命令大全&#xff1a;从攻防到优化的专业实践 作者&#xff1a;高级网络安全工程师 吉林•镇赉融媒 刘晓伟 最后更新&#xff1a;2025年8月 适用对象&#xff1a;网络安全、运维从业者 浏览器作为访问互联网资源的主要入口&#xff0c;其配置…

用 “故事 + 价值观” 快速建立 IP 信任感

在知识变现、流量变现与粉丝变现的实践中&#xff0c;IP 的核心竞争力在于用户信任。“故事 价值观” 的组合&#xff0c;能快速缩短与用户的距离 —— 故事让 IP 从抽象符号变为可感知的存在&#xff0c;价值观则推动用户从被动关注转为主动认同&#xff0c;二者共同为变现筑…