前言
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>)
相关推荐
Spring JDBCTemplate连接池jar包
strut2+spring+springjdbctemplate做的简易登录系统
Druid数据库连接池的SpringJDBCTemplate所需的jar包,Druid数据库连接池的SpringJDBCTemplate所需的jar包,Druid数据库连接池的SpringJDBCTemplate所需的jar包,Druid数据库连接池的SpringJDBCTemplate所需的jar包,...
JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。 在JdbcTemplate中执行SQL语句...
Spring JdbcTemplate调用Oracle存储过程输出游标结果集实现增删改查
一个非常简单基于注解的Spring JdbcTemplate,供初学者参考用。
模仿spring jdbcTemplate的粗略实现,只有很小的参考价值,如果是java初学者可以使用这个封装好的工具进行数据库操作,只需要在db.properties里配置好driver,url等信息
spring-jdbcTemplate实例工程
Spring JdbcTemplate的操作,包括接口,BaseDao,log4J配置文件,主要为oracle数据库操作,很多特殊方法只对oracle有效
SpringJdbcTemplate封装工具包,包括规范model格式接口,封装SpringJdbcTemplate,实现分页,自适应多种数据库
1.Spring4前 spring-jdbc包是独立的,4以后spring-jdbc 就已经没有了
JdbcTemplate api 下载 Spring
使用Spring的JdbcTemplate实现分页功能
spring JdbcTemplate query方法使用示例,欢迎下载借鉴
使用Spring的JdbcTemplate调用Oracle的存储过程
spring jdbctemplate组件的简单实例。可以直接运行该实例来学习spring的jdbctemplate。处于初学者,或开发互联网性能要求较高的比较有料。
SSH笔记-Spring JdbcTemplate,使用JdbcTemplate对数据库进行操作,使用具名参数和JDBC模板,简化操作
NULL 博文链接:https://rayfuxk.iteye.com/blog/2286519
运用Spring中关于JDBC的一个辅助类(JDBC Template),进行curd操作
本篇文档主要介绍Spring JDBCTemplate知识。亦可作为Spring JDBCTemplate的API文档。文档中的内容,对于学习Spring JDBCTemplate有很大的帮助,也可帮助他人学习Spring Boot中的JDBCTemplate知识。