Spring事务管理高级应用难点剖析: 第3部分 - 编程入门网
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 获取数据连接
重新运行代码,得到如下的执行结 果: 清单 7. 输出日志
对照清单 4 的输出日志,我们可以 看到已经没有连接泄漏的现象了。一个执行线程在运行 JdbcUserService#logon() 方法时,只 占用一个连接,而且方法执行完毕后,该连接马上释放。这说明通过 DataSourceUtils.getConnection() 方法确实获取了方法所在事务上下文绑定的那个连接,而 不是像原来那样从数据源中获取一个新的连接。 使用 DataSourceUtils 获取数据连接 也可能造成泄漏! 是否使用 DataSourceUtils 获取数据连接就可以高枕无忧了呢?理 想很美好,但现实很残酷:如果 DataSourceUtils 在没有事务上下文的方法中使用 getConnection() 获取连接,依然会造成数据连接泄漏! 保持代码清单 6 的代码不变 ,调整 Spring 配置文件,将清单 3 中 Spring AOP 事务增强配置的代码注释掉,重新运行清 单 6 的代码,将得到如下的输出日志: 清单 8. 输出日志
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |