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

Spring数据库连接控制全解析

以下内容是 Spring Framework 官方文档中关于数据库连接控制(Controlling Database Connections)的第 3.4 节,主要介绍了 Spring 如何管理 JDBC 数据源和数据库连接。以下是对该部分内容的中文解析与总结,便于理解和应用。


📚 3.4 控制数据库连接(Controlling Database Connections)

在 Spring 的 JDBC 框架中,所有数据库操作都通过 DataSource 获取连接。本节介绍不同类型的 DataSource 实现、工具类以及事务集成方式。


✅ 3.4.1 使用 DataSource

DataSource 是 JDBC 规范定义的标准接口,代表一个通用的数据库连接工厂。相比传统的 DriverManager.getConnection(),它更灵活,支持:

  • 连接池
  • 事务管理
  • 容器集成(如 JNDI)
  • 解耦应用程序与底层连接细节
主要用途:
  • 开发者无需关心连接如何创建或管理。
  • 管理员配置生产环境的数据源(如连接池参数、高可用等)。
  • 开发测试时可自行配置简易数据源。
常见实现选择:
类型说明推荐场景
HikariCP高性能现代连接池(推荐)生产环境首选
Apache Commons DBCP老牌开源连接池已逐渐被替代
C3P0自动配置能力强较老项目仍在使用

⚠️ 注意:Spring 提供的 DriverManagerDataSourceSimpleDriverDataSource 不提供连接池功能,仅用于单元测试或简单原型开发

示例:Java 方式配置 DriverManagerDataSource
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");
dataSource.setUsername("sa");
dataSource.setPassword("");
XML 配置示例(使用属性文件)
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/>
</bean><context:property-placeholder location="jdbc.properties"/>

💡 属性文件 jdbc.properties 示例:

jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://localhost:
jdbc.username=sa
jdbc.password=
第三方连接池配置示例
Apache DBCP(BasicDataSource)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/>
</bean>
C3P0(ComboPooledDataSource)
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"><property name="driverClass" value="${jdbc.driverClassName}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/>
</bean>

🔔 注意:DBCP 和 C3P0 已逐步被 HikariCP 替代。新项目建议直接使用 HikariCP。


✅ 3.4.2 使用 DataSourceUtils

这是一个非常重要的辅助工具类,用于安全地获取和释放数据库连接。

核心功能:
  • DataSourceUtils.getConnection(DataSource)
    获取当前线程绑定的连接(若正在事务中),否则从数据源获取新连接。
  • DataSourceUtils.releaseConnection(Connection, DataSource)
    正确关闭连接或归还到连接池,考虑事务上下文。
优势:
  • 支持 事务同步(例如配合 DataSourceTransactionManager 使用)
  • 框架内部(如 JdbcTemplate)自动使用此机制
  • 比直接调用 dataSource.getConnection() 更安全可靠

✅ 推荐:编写自定义 DAO 或访问逻辑时也应优先使用 DataSourceUtils


✅ 3.4.3 实现 SmartDataSource 接口

SmartDataSource 扩展了标准 DataSource,允许使用者查询某个连接是否应在使用后关闭。

方法:
boolean shouldClose(Connection con);
应用场景:
  • 当你知道需要重用连接时(比如批量操作)
  • 特定框架内部优化使用(较少手动实现)

✅ 3.4.4 扩展 AbstractDataSource

这是 Spring 提供的一个抽象基类,封装了 DataSource 的公共行为(如日志、异常处理等)。

适用情况:
  • 若需自定义 DataSource 实现(如加密代理、监控包装器等)
  • 继承 AbstractDataSource 可减少重复编码

✅ 3.4.5 使用 SingleConnectionDataSource

此实现属于 SmartDataSource始终返回同一个数据库连接,不会真正关闭连接。

特点:
  • 单线程使用(非线程安全)
  • 不适用于多并发场景
  • 设置 suppressClose=true 时,会返回一个“假关闭”的代理连接
典型用途:
  • 单元测试
  • 独立运行的小程序
  • 快速验证 SQL 脚本执行

❗ 注意:不能转换为原生数据库连接(如 OracleConnection),因为可能被代理包装。


✅ 3.4.6 使用 DriverManagerDataSource

这是最简单的 DataSource 实现,每次调用 getConnection() 都会创建一个新的物理连接。

缺点:
  • 无连接池 → 性能差
  • 频繁建立/断开连接消耗资源
适用场景:
  • 测试环境
  • 小型脚本或演示程序

✅ 替代方案:即使是测试环境,也推荐使用 HikariCP 或 DBCP 创建轻量级连接池。


✅ 3.4.7 使用 TransactionAwareDataSourceProxy

这是一个代理包装器,使普通 DataSource 具备感知 Spring 事务的能力。

示例代码:
DataSource dataSource = new TransactionAwareDataSourceProxy(targetDataSource);
作用:
  • 让旧有代码(期望标准 DataSource)也能参与 Spring 的事务管理
  • 在事务期间保证使用的是同一个线程绑定连接
使用建议:
  • 很少需要手动使用
  • 更推荐使用 JdbcTemplateDataSourceUtils 这些更高层抽象
  • 仅当必须将 DataSource 对象传给第三方库且希望其参与事务时才使用

✅ 3.4.8 使用 DataSourceTransactionManager

这是 Spring 中用于单个数据库的本地事务管理器。

特性:
  • 基于 JDBC 的 Connection 进行事务控制
  • 将连接绑定到当前线程(ThreadLocal)
  • 支持设置隔离级别、超时时间
  • 不依赖 Java EE 容器(即不需要 JTA)
配置示例(XML):
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>
使用要求:
  • 获取连接必须使用:
    Connection conn = DataSourceUtils.getConnection(dataSource);
    
    而不是:
    Connection conn = dataSource.getConnection(); // ❌ 可能脱离事务
    
框架集成:
  • JdbcTemplateNamedParameterJdbcTemplate 等自动使用 DataSourceUtils
  • 因此天然支持事务管理
优点对比 JTA:
  • 更轻量,无需应用服务器支持
  • 支持自定义隔离级别(JTA 不支持)
  • 配置切换方便(只需改 PlatformTransactionManager bean)

🧩 总结与最佳实践

场景推荐方案
生产环境HikariCP + DataSourceTransactionManager
测试环境HikariCP(最小池大小=1)或 SingleConnectionDataSource(简单脚本)
获取连接使用 DataSourceUtils.getConnection()JdbcTemplate
事务管理使用 @Transactional + DataSourceTransactionManager
避免使用DriverManagerDataSource(除非极简测试)
旧代码兼容考虑 TransactionAwareDataSourceProxy

🛠️ 补充建议(现代 Spring Boot 项目)

如果您使用的是 Spring Boot,这些配置大多可以自动化完成:

# application.yml
spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSourcehikari:maximum-pool-size: 20

Spring Boot 自动配置 DataSourceJdbcTemplateDataSourceTransactionManager,无需手动 XML 或 Java Config。


如有具体问题(如配置报错、连接泄漏排查、事务不生效等),欢迎继续提问!

http://www.dtcms.com/a/542905.html

相关文章:

  • 电子商务网站建设编码专门做当归的网站
  • 中国的门户网站有哪些百度申请qq号免费注册
  • 网站建设报价费用是多少dedecms手机网站模板安装教程
  • 英国T4学生签证 可以做网站吗苏州seo网站诊断
  • 什么是网页设计与网站建设公司快速建站
  • 个人网站设计介绍文字公司网站建设都需要什么内容
  • 网站建设公众号小程序属于什么自己做网站收费么
  • 东莞网站建设方案服务ppt模板免费下载百度云
  • 株洲公司做网站网站维护费计入什么科目
  • 智能云建站平台上海平台网站建设哪家好
  • 网站系统找不到指定的文件网站网页设计项目计划书
  • it网站建设方案移动宽带续费网上可以续费嘛
  • 做医院网站合作网站开发
  • 网站建设 小知识超低价的锦州网站建设
  • 网站建设怎么销售如何破解wordpress数据库
  • 怎样开发手机网站建设公司网站怎么写
  • 深圳科源建设集团有限公司网站泰安网站建设排行
  • 制作企业网站需要注意的事项网上商城网站建设报价
  • 电视盒子做网站服务器郑州网站建设最便宜
  • wordpress默认站点正能量软件网站免费入口
  • 基于python二手车价值评估系统的设计与实现
  • mstsc做网站平台推广广告宣传词
  • 做会计题目的网站高密做网站的代理
  • 网站图片自动下载建设网站的群
  • 安徽网站优化多少钱网站咨询弹窗是怎么做的
  • 高端网站改版顾问网页视频下载快捷指令库
  • 选手评分问题(python)
  • 焕识品牌设计镇江抖音seo
  • 电子商务网站建设与管理 教案一个人可以建设几个网站
  • 网站建设的基本流程和步骤南宁建站平台