前言
Spring JdbcTemplate在通过DataSourceUtils管理Connection,DataSourceUtils通过ConnectionHolder管理Connection。并且将ConnectionHolder保存在ThreadLocal,所以是线程安全的。
详见org.springframework.jdbc.datasource.DataSourceUtils#getConnection
问题
但是在释放的时候,ConnectionHolder的实现类SimpleConnectionHandle的releaseConnection缺失一个空方法。导致该Connection出现问题后无法更换Connection。比如,使用数据库连接池,重启数据库后SQL会一直执行失败。
解决方法
org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection方法中通过TransactionSynchronizationManager.getResource(dataSource);返回ConnectionHolder,如果返回null则重新创建,debug下去,发现在org.springframework.transaction.support.TransactionSynchronizationManager#doGetResource方法里面,通过((ResourceHolder) value).isVoid()判断是否值为空,如果isVoid返回true,则删除当前线程中的ConnectionHolder。所以想办法将isVoid设置为true,就可以实现释放当前Connection。
Exception中处理代码如下:
public static void released(JdbcTemplate jdbcTemplate) { try { ConnectionHolder holder = (ConnectionHolder) TransactionSynchronizationManager.getResource(jdbcTemplate.getDataSource()); holder.getConnection().close(); // set holder isVoid true holder.unbound(); } catch (SQLException e1) { e1.printStackTrace(); } }
写在最后
以上问题的分析和处理是通过debug下面的方法得出的,所以遇到问题查看源码确实是一种非常好的方法。
org.springframework.jdbc.core.JdbcTemplate#execute(org.springframework.jdbc.core.PreparedStatementCreator, org.springframework.jdbc.core.PreparedStatementCallback<T>)
相关推荐
JdbcTemplate是Spring框架中用于简化JDBC操作的工具类,它提供了一种更安全、更易用的方式来执行数据库操作,避免了手动管理数据库资源和处理潜在的资源泄露问题。通过JdbcTemplate,开发者可以专注于SQL语句的编写...
在这些示例中,JdbcTemplate自动处理了事务管理、异常转换和资源释放,大大简化了代码。 此外,JdbcTemplate还提供了其他高级功能,如批量操作、分页查询、存储过程调用等。同时,它也支持PreparedStatement,可以...
传统的JDBC编程通常涉及到大量的资源管理代码,如连接的获取与释放、PreparedStatement的创建与关闭、ResultSet的处理等。这些代码不仅冗余,还容易出现资源泄露和异常处理不当的问题。例如,上述部分给出的JDBC示例...
JdbcUtils使用指南JdbcUtils是JDBC的工具类,封装了JDBC连接获取,语句结构,资源释放等繁琐步骤,对外提供简洁的数据库查询和更新操作接口。使用前准备添加maven仓库地址< repositories> < repository> < id>byx-...
JdbcTemplate 是 Spring 框架的一部分,提供了一个方便的 API 来执行 SQL 查询和更新,避免了手动处理 JDBC 连接、预编译语句等繁琐工作。它使得数据库操作更加安全、易于测试和调试,同时也保持了良好的封装性。 ...
然而,单纯使用`JdbcTemplate`进行数据库操作时,并不能自动管理事务,因此我们需要了解如何通过`JdbcTemplate`结合Spring框架来实现事务控制。 #### 二、原生 JDBC 的事务控制 在没有使用任何框架的情况下,我们...
在回调方法执行后,如果出现SQLException,JdbcTemplate会负责释放连接,并将数据库异常转换为Spring的DataAccessException,以便提供一致的异常处理机制。 JdbcTemplate的核心在于其模板方法的设计模式,它将不变...
在"spring连接数据库aop-jdbc"这个主题中,我们主要关注Spring框架如何通过AOP(面向切面编程)和JDBC(Java Database Connectivity)来实现数据库的高效管理。以下是关于这一主题的详细知识: 1. **Spring JDBC...
1. **性能优化**:通过连接池,Spring可以快速获取和释放数据库连接,提高应用性能。 2. **资源管理**:Spring自动管理连接池,开发者无需关心连接的创建和关闭,降低了出错的可能性。 3. **事务支持**:结合Spring...
JdbcTemplate基本使用 ...JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。
5. **DataSourceUtils** 和 **ConnectionUtils**:这些工具类帮助管理DataSource和数据库连接,确保资源的正确获取和释放,防止资源泄露。 在实际应用中,Spring JDBC提供了以下优势: - **代码简洁性**:通过模板...
JDBCTemplate是Spring框架中的一个组件,它封装了JDBC的常用操作,简化了数据库访问,并且提供了事务管理的支持。使用JDBCTemplate,开发者可以避免手动处理SQL字符串和结果集,而是使用模板方法来执行SQL,降低了...
这个工具类提供了一些实用方法,如获取和释放数据库连接,帮助开发者更好地管理数据库连接池,如Apache的Commons DBCP或C3P0。 8. **Exception Translation** Spring JDBC对JDBC的异常进行了封装,将数据库特定的...
数据库连接池在JDBC编程中扮演着重要角色,它管理数据库连接的创建、分配和释放,以提高性能并减少资源消耗。`commons-dbcp.jar`提供了数据库连接池的实现,而`commons-pool.jar`是对象池服务,DBCP依赖它来管理...
Spring框架中的JDBCTemplate是JDBC的一个高级封装,简化了数据库操作,提供了事务管理、异常转换等功能。使用JDBCTemplate,开发者无需直接与Statement或PreparedStatement对象打交道,而是通过方法调用来执行SQL,...
源码分析有助于理解数据源的配置、连接的获取与释放等过程。 Spring JDBC还支持动态SQL,例如使用SqlProvider和RowMapper,它们可以根据业务需求动态构建SQL语句并映射结果到Java对象。源码分析可以帮助我们理解...
3. **资源释放**:通过使用Spring提供的`JdbcTemplate`类,可以确保即使在出现异常的情况下也能正确关闭资源,避免资源泄漏。 ### JdbcTemplate 类详解 `JdbcTemplate`是Spring JDBC模块中最为核心的一个类,它...
-- 最大空闲值,当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接释放,一直减少到msxIdle 为止 --> <!-- 最小空闲值,当空闲的连接数小于阀值时,连接池就会预申请一些连接,以免洪峰到来时来不及申请 -...