【Spring事物三千问】DataSource的设计和常用实现——Hikari、Druid

本文介绍了javax.sql.DataSource作为数据库连接工厂接口的重要性,对比了传统的DriverManager。讨论了Spring框架中常用的DataSource实现,如Hikari和Druid,以及动态路由数据源AbstractRoutingDataSource。文章还提出了静态和动态多数据源配置的策略。
部署运行你感兴趣的模型镜像

javax.sql.DataSource

javax.sql.DataSource 是 jdk 提供的接口,各个连接池厂商 和 Spring 都对 DataSource 进行了设计和实现。
javax.sql.DataSource 是连接到物理数据源的工厂接口。它是 java.sql.DriverManager 功能的替代者,是获取数据库连接的首选方法。
DataSource 数据源在必要时可以修改它的属性。例如,如果将数据源移动到其他服务器,则可以更改 DataSource 的属性,这样访问该数据源的代码不需要做任何更改就可以获取到达到目的。
有些 DataSource 的连接池实现还可以支持部分属性在程序运行期间进行修改。

最原始的获取 DB 连接的方法是使用 java.sql.DriverManager#getConnection() 来获取连接。
现在都推荐使用 javax.sql.DataSource#getConnection() 来获取连接。

Spring 对 DataSource 的封装

类图如下:
DataSource.png

图中列出了 DataSource 的三个典型的实现类: HikariDataSource、DruidDataSource 和 AbstractRoutingDataSource

HikariDataSource

HikariDataSource 是 SpringBoot 默认使用的连接池,而且代码量是很少的。
连接池相关的配置参数是放在父类 HikariConfig 中的。

HikariConfig.png

Hikari 连接池的参数分成了两类:一类是可以在运行期间动态修改的;一类是在运行期间不可修改的。
配置项的说明可以参考:
https://github.com/brettwooldridge/HikariCP
https://pdai.tech/md/spring/springboot/springboot-x-mysql-HikariCP.html

关于 connectionTestQuery 参数

connectionTestQuery 参数的作用是:
在一个连接从连接池中拿出来之前,会优先执行 connectionTestQuery 指定的查询语句,从而验证这个连接是存活且有效的。

如果驱动程序支持 JDBC4,那么强烈建议不要设置此属性。
connectionTestQuery 参数是针对不支持 JDBC4 的 Connection#isValid() API 接口的“传统”驱动程序的。
如果没有设置 connectionTestQuery,且驱动程序不支持 JDBC4,那么 HikariCP 将记录一个错误。

DruidDataSource

Druid 连接池是阿里巴巴开源的数据库连接池。Druid 连接池是以监控为主的连接池。
Druid 的配置参数有很多,大致分为了三类:JDBC配置;连接池配置;监控配置

DruidConfig.png

配置说明可以参考:
https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
https://pdai.tech/md/spring/springboot/springboot-x-mysql-druid.html
https://github.com/alibaba/druid/wiki/DruidDataSource配置属性列表

AbstractRoutingDataSource

AbstractRoutingDataSource 是 Spring 对 DataSource 的抽象实现。它是一个基于 lookup key ,将 DataSource#getConnection() 的调用路由到目标数据源的抽象数据源实现。
通常都是通过 ThreadLocal 绑定的事务上下文变量来确定路由到哪个目标数据源。

IsolationLevelDataSourceRouter 是 AbstractRoutingDataSource 的实现类,它是一个能基于当前事务隔离级别路由到目标数据源的 DataSource 数据源。

举一反三:多数据源配置的思考

结合前面对 多事物管理器和多数据源处理 的分析,以及上面对 AbstractRoutingDataSource 特性的讲解,我们可以发现,多数据源的切换可以通过两种方式来实现:

1、静态多数据源的方式来配置

  • 首先,配置多个 DataSource
  • 然后,配置多个 SqlSessionFactory。
    当然,这些 SqlSessionFactory 都是基于上面的 DataSource 来配置的,这样就可以通过 MyBatis 的 Mapper 接口来组装 sql 操作 DB 了。

很显然,这种方式比较适合异构的数据源,即每个数据源中的表都是不一样的,这样定义出来的 MyBatis 的 Mapper 接口也不一样。
那如果是分库分表的数据源(或者主从结构的数据源),这类数据源中的表的结构都是一样的,如果也使用这种静态多数据源的方式来配置的话,就需要定义多个一模一样的 Mapper 接口,这样就会显得冗余且不太优雅。

2、动态多数据源切换的方式

基于 AbstractRoutingDataSource 来进行数据源的切换。

动态数据源的切换可以通过自定义注解的方式,对方法打标记来实现,这里对具体的实现方式不做展开

很显然,这种方式就比较适合分库分表的数据源(或者主从结构的数据源),定义一套 MyBatis 的 Mapper 接口就可以操作多个数据源了。

小结

javax.sql.DataSource 是连接到物理数据源的工厂接口。它是 java.sql.DriverManager 功能的替代者,是获取数据库连接的首选方法。

DataSource 三个典型的实现类: HikariDataSource、DruidDataSource 和 AbstractRoutingDataSource

  • HikariDataSource: SpringBoot 默认使用的数据源实现
  • DruidDataSource: 阿里 Druid 连接池使用的数据源实现
  • AbstractRoutingDataSource: Spring 抽象出来的可动态路由的数据源实现

您可能感兴趣的与本文相关的镜像

Qwen3-14B

Qwen3-14B

文本生成
Qwen3

Qwen3 是 Qwen 系列中的最新一代大型语言模型,提供了一整套密集型和专家混合(MoE)模型。基于广泛的训练,Qwen3 在推理、指令执行、代理能力和多语言支持方面取得了突破性进展

<think>嗯,用户的是Spring DataSourceDruid数据源的区别以及使用场景对比。首先,我需要明确这两个概念。Spring DataSourceSpring框架中定义的一个接口,用来抽象数据源的连接,而Druid是阿里巴巴开源的一个具体的数据源实现,提供了连接池、监控等功能。 用户可能不太清楚它们之间的关系,容易混淆。Spring默认的数据源在2.x版本用的是HikariCP,而Druid是一个第三方的高性能数据源。需要解释清楚DataSource是一个标准接口,而Druid是该接口的一个具体实现。 接下来要对比两者的核心差异。比如,DataSource是接口,Druid实现类。功能方面,Druid有监控、SQL防注入等,而Spring默认的DataSource可能功能较少。性能方面,HikariCPDruid都是优秀的,但Druid在监控方面更强大。 使用场景方面,用户可能需要根据是否需要监控来选择。比如企业级应用需要监控防注入的话,Druid更合适。如果是轻量级应用,可能用默认的HikariCP就够了。另外,Spring Boot集成Druid需要额外的配置,用户可能需要参考引用中的配置方法,比如手动创建Druid的配置类,或者使用starter依赖。 还要注意用户提供的引用内容,比如引用4中提到需要手动配置Druid的属性,否则不会生效,这点很重要。用户可能在配置时遇到题,需要说明如何正确配置Druid。 最后,生成相关题时要围绕数据源选择、配置、监控以及多数据源处理等,这些都是用户可能进一步关心的题。</think>### Spring DataSourceDruid数据源的区别及使用场景对比 #### 1. 核心概念差异 - **Spring DataSource** 是Java标准接口$javax.sql.DataSource$的抽象,表示通用的数据源连接对象。Spring Boot 2.x默认实现为$HikariDataSource$,主要提供基础数据库连接池功能[^2]。 示例配置: ```yaml spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=root spring.datasource.password=123456 ``` - **Druid数据源** 是阿里巴巴开源的增强型数据源实现$com.alibaba.druid.pool.DruidDataSource$,除基础连接池外提供: - SQL执行监控 - 防御SQL注入 - 数据库密码加密 - 可视化统计功能 需通过$druid-spring-boot-starter$集成[^3] #### 2. 功能对比表 | 特性 | Spring默认数据源(Hikari) | Druid数据源 | |---------------------|--------------------------|----------------------| | 连接池性能 | 极高 | 高 | | 监控面板 | 无 | 内置可视化统计 | | SQL防注入 | 不支持 | 支持 | | 扩展功能 | 基础功能 | 慢SQL记录/防火墙等 | | 配置复杂度 | 简单 | 需要额外配置[^4] | #### 3. 使用场景建议 - **选择Spring默认数据源**: 当项目需要快速搭建、轻量级应用且无需复杂监控时,如原型系统开发、小型Web应用 - **选择Druid数据源**: 1. 企业级系统需要SQL监控性能分析 2. 高安全性要求的金融系统(依赖其SQL防火墙) 3. 需要多数据源管理的场景(需配合@DSTransactional等注解)[^3] 示例Druid监控配置: ```java @Bean public ServletRegistrationBean<StatViewServlet> druidServlet() { return new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); } ``` #### 4. 典型配置差异 Spring Boot需通过$@Configuration$类显式配置Druid属性才能生效[^4]: ```java @ConfigurationProperties(prefix = "spring.datasource") @Bean public DataSource druidDataSource() { return new DruidDataSource(); // 必须显式创建Druid对象 } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老王学源码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值