博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring JdbcTemplate释放连接
阅读量:4048 次
发布时间:2019-05-25

本文共 1347 字,大约阅读时间需要 4 分钟。

前言

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>)

 

转载地址:http://khyci.baihongyu.com/

你可能感兴趣的文章
gdb debug tips
查看>>
arm linux 生成火焰图
查看>>
linux和windows内存布局验证
查看>>
linux insmod error -1 required key invalid
查看>>
linux kconfig配置
查看>>
linux不同模块completion通信
查看>>
linux printf获得时间戳
查看>>
C语言位扩展
查看>>
linux irqdebug
查看>>
git 常用命令
查看>>
linux位操作API
查看>>
uboot.lds文件分析
查看>>
uboot start.s文件分析
查看>>
没有路由器的情况下,开发板,虚拟机Ubuntu,win10主机,三者也可以ping通
查看>>
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>
忽略图片透明区域的事件(Flex)
查看>>
忽略图片透明区域的事件(Flex)
查看>>
AS3 Flex基础知识100条
查看>>
Flex动态获取flash资源库文件
查看>>