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

详细介绍:Spring数据库连接控制全解析

详细介绍: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(),它更灵活,支持:

主要用途:
  • 开发者无需关心连接如何创建或管理。
  • 管理员配置生产环境的数据源(如连接池参数、高可用等)。
  • 开发测试时可自行配置简易数据源。
常见实现选择:
类型说明推荐场景
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

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

核心功能:
优势:
  • 支持 事务同步(例如配合 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 时,会返回一个“假关闭”的代理连接
典型用途:

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


✅ 3.4.6 使用 DriverManagerDataSource

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

缺点:
适用场景:
  • 测试环境
  • 小型脚本或演示程序

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


✅ 3.4.7 使用 TransactionAwareDataSourceProxy

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

示例代码:
DataSource dataSource = new TransactionAwareDataSourceProxy(targetDataSource);
作用:
  • 让旧有代码(期望标准 DataSource)也能参与 Spring 的事务管理
  • 在事务期间保证使用的是同一个线程绑定连接
使用建议:

✅ 3.4.8 使用 DataSourceTransactionManager

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

特性:
配置示例(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:

总结与最佳实践

场景推荐方案
生产环境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/mydb
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
maximum-pool-size: 20

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


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

http://www.zskr.cn/news/64203.html

相关文章:

  • 习题解析之:奇偶插入
  • 2025美白淡斑面膜品牌Top5实测推荐!色斑暗黄党必看,有效去痘印产品
  • 软件安全 --- 安卓安全 之 动态加载
  • 实用指南:复原大唐3d项目测试版
  • 2025年值得关注的纸杯机与纸碗机、纸盖机一体化解决方案提供商
  • 2025最新宠物抓伤急救液品牌怎么选?葆爱堂专注宠物健康,宠物抓伤创面消毒液/宠物消杀,更专业,更安全
  • 从纸杯机到纸盘机!2025 全品类制杯机选购指南:全伺服 / 超声波款 + 纸碗机 / 纸盖机省本技巧
  • 降低动态功耗的利器:Clock Gating 技术解析
  • 大模型开发技巧记录(不定期更新)
  • 2025年字节跳动奖学金揭晓:20位获奖人才研究方向速览
  • CoaXPress 相机采集卡对比 - Hello
  • 2025建材推荐榜:煌匠美缝剂_环氧地坪_彩砂自流平,装修选材必看!
  • 【IEEE出版 | EI检索】第七届国际科技创新学术交流大会暨信息技术与计算机应用学术会议(ITCA 2025)
  • 2025年东莞樟木头搬家服务权威推荐榜单:东莞同城搬家公司/东莞厚街搬家服务/东莞大岭山搬家服务精选
  • 河南煌匠建材:专注美缝剂、环氧地坪、彩砂自流平,15年匠心守护优质空间 (2)
  • 6款免费AI毕业论文工具推荐:一键生成+零成本降重,效率翻倍
  • 打开文件夹
  • 玩 Linux 随便记录点东西
  • 占有率最高的工业总线:PROFINET、Modbus 与 EtherCAT
  • 2025年广东家装全屋定制推广权威推荐榜单:广东全屋家具定制/广东全屋整装家具定制/广东全屋定制柜子供货商精选
  • 【IEEE出版 | EI检索】第七届国际科技创新学术交流大会暨通信、信息系统和软件工程学术会议(CISSE 2025)
  • 大带宽服务器租用建站有哪些优势
  • 隐私代币逆势上涨背后的技术、监管与市场博弈
  • 控油洗发水哪款好?10 款高口碑款推荐,解决头油显邋遢 + 贴头皮尴尬
  • 2025 年市面上四川不锈钢井盖 / 不锈钢井盖厂家最新TOP排名
  • GAN模型
  • GD32F407VE天空星开发板的MQ135的空气质量检测 - 详解
  • 2025年WMS仓库管理系统选型指南(最新)
  • 2025年数字员工手机十大推荐:高性价比、抗摔能力与服务体验
  • 布尔型数组