快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
ger.debug(           "Fetching resumed JDBC  Connection from DataSource");         conHolder.setConnection (dataSource.getConnection());       }   return  conHolder.getConnection();  }  //②如果获取不到,则直接从数据源中 获取连接     Connection con = dataSource.getConnection();      //③如果拥有事务上下文,则将连接绑定到事务上下文中     if  (TransactionSynchronizationManager.isSynchronizationActive()) {        ConnectionHolder holderToUse = conHolder;       if (holderToUse ==  null) {   holderToUse = new ConnectionHolder(con);   }    else {holderToUse.setConnection(con);}       holderToUse.requested ();   TransactionSynchronizationManager.registerSynchronization(          new ConnectionSynchronization(holderToUse, dataSource));    holderToUse.setSynchronizedWithTransaction(true);   if (holderToUse !=  conHolder) {   TransactionSynchronizationManager.bindResource(          dataSource, holderToUse);   }  }  return con;  }   … }

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

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

它首先查看当前是否存在事务管理上下文,并 尝试从事务管理上下文获取连接,如果获取失败,直接从数据源中获取连接。在获取连接后, 如果当前拥有事务上下文,则将连接绑定到事务上下文中。

我们在清单 1 的 JdbcUserService 中,使用 DataSourceUtils.getConnection() 替换直接从数据源中获取连接 的代码:

清单 6. JdbcUserService.java:使用 DataSourceUtils 获取数据连接

public void logon(String userName) {   try {      //Connection conn = jdbcTemplate.getDataSource().getConnection();      //①使用DataSourceUtils获取数据连接     Connection 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();   } }

重新运行代码,得到如下的执行结 果:

清单 7. 输出日志

连接数 [active:idle]-[0:0] 连接数  [active:idle]-[1:0] 连接数 [active:idle]-[0:1] 连接数 [active:idle]- [1:0] 连接数 [active:idle]-[0:1]

对照清单 4 的输出日志,我们可以 看到已经没有连接泄漏的现象了。一个执行线程在运行 JdbcUserService#logon() 方法时,只 占用一个连接,而且方法执行完毕后,该连接马上释放。这说明通过 DataSourceUtils.getConnection() 方法确实获取了方法所在事务上下文绑定的那个连接,而 不是像原来那样从数据源中获取一个新的连接。

使用 DataSourceUtils 获取数据连接 也可能造成泄漏!

是否使用 DataSourceUtils 获取数据连接就可以高枕无忧了呢?理 想很美好,但现实很残酷:如果 DataSourceUtils 在没有事务上下文的方法中使用 getConnection() 获取连接,依然会造成数据连接泄漏!

保持代码清单 6 的代码不变 ,调整 Spring 配置文件,将清单 3 中 Spring AOP 事务增强配置的代码注释掉,重新运行清 单 6 的代码,将得到如下的输出日志:

清单 8. 输出日志

连接数  [active:idle]-[0:0] 连接数 [active:i

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号