快速业务通道

Spring事务管理高级应用难点剖析: 第3部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
dle]-[1:1] 连接数 [active:idle]- [1:1] 连接数 [active:idle]-[2:1] 连接数 [active:idle]-[2:1]

我们通过下表对数据源连接的占用和泄漏情况进行描述:

表 2. 执行过 程数据源连接占用情况

时间 执行线程 1 执行线 程 2 数据源连接
active idle leak
T0 未启动 未启动 0 0 0
T1 正在执行方法 未启动 1 1 0
T2 执行完毕 未启动 1 1 1
T3 执行完毕 正 式执行方法 2 1 1
T4 执行完毕 执行完毕 2 1 2

Spring事务管理高级应用难点剖析: 第3部分(7)

时间:2012-04-26 IBM 陈雄华

仔细对 照表 1 的执行过程,我们发现在 T1 时,有事务上下文时的 active 为 2,idle 为 0,而此 时由于没有事务管理,则 active 为 1 而 idle 也为 1。这说明有事务上下文时,需要等到整 个事务方法(即 logon())返回后,事务上下文绑定的连接才释放。但在没有事务上下文时, logon() 调用 JdbcTemplate 执行完数据操作后,马上就释放连接。

在 T2 执行线程完 成 logon() 方法的执行后,有一个连接没有被释放(active),所以发生了连接泄漏。到 T4 时,两个执行线程都完成了 logon() 方法的调用,但是出现了两个未释放的连接。

要 堵上这个连接泄漏的漏洞,需要对 logon() 方法进行如下的改造:

清单 9.JdbcUserService.java:手工释放获取的连接

public void logon(String  userName) {   Connection conn = null;   try {     conn  = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());      String sql = "UPDATE t_user SET last_logon_time=? WHERE user_name =?";     jdbcTemplate.update(sql, System.currentTimeMillis(), userName);      Thread.sleep(1000);     // ①   } catch (Exception e)  {     e.printStackTrace();   }finally {     // ②显式使 用DataSourceUtils释放连接     DataSourceUtils.releaseConnection (conn,jdbcTemplate.getDataSource());   } }

在 ② 处显式调 用 DataSourceUtils.releaseConnection() 方法释放获取的连接。特别需要指出的是:一定不 能在 ① 处释放连接!因为如果 logon() 在获取连接后,① 处代码前这段代码执行时发生异 常,则①处释放连接的动作将得不到执行。这将是一个非常具有隐蔽性的连接泄漏的隐患点。

JdbcTemplate 如何做到对连接泄漏的免疫

分析 JdbcTemplate 的代码,我们可 以清楚地看到它开放的每个数据操作方法,首先都使用 DataSourceUtils 获取连接,在方法返 回之前使用 DataSourceUtils 释放连接。

来看一下 JdbcTemplate 最核心的一个数据 操作方法 execute():

清单 10.JdbcTemplate#execute()

public  <T> T execute(StatementCallback<T> action) throws  DataAccessException {   //① 首先根据DataSourceUtils获取数据连接    Connection con = DataSourceUtils.getConnection(getDataSource()

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号