Spring事务管理高级应用难点剖析III
?
在 JdbcUserService 中添加一个可异步执行 logon() 方法的 asynchrLogon() 方法,我们通过异步执行 logon() 以及让主线程睡眠的方式模拟多线程环境下的执行场景。在不同的执行点,通过 reportConn() 方法汇报数据源连接的占用情况。
使用如下的 Spring 配置文件对 JdbcUserServie 的方法进行事务增强:
清单 3.applicationContext.xml
?
保证 BasicDataSource 数据源的配置默认连接为 0,运行以上程序代码,在控制台中将输出以下的信息:
清单 4. 输出日志
?
对数据源进行代理后,我们就可以通过数据源代理对象的 getConnection() 获取事务上下文中绑定的数据连接了。
因此,如果数据源已经进行了 TransactionAwareDataSourceProxy 的代理,而且方法存在事务上下文,那么清单 1 的代码也不会生产连接泄漏的问题。
其它数据访问技术的等价类
理解了 Spring JDBC 的数据连接泄漏问题,其中的道理可以平滑地推广到其它框架中去。Spring 为每个数据访问技术框架都提供了一个获取事务上下文绑定的数据连接(或其衍生品)的工具类和数据源(或其衍生品)的代理类。
DataSourceUtils 的等价类
下表列出了不同数据访问技术对应 DataSourceUtils 的等价类:
表 3. 不同数据访问框架 DataSourceUtils 的等价类
?
TransactionAwareDataSourceProxy 的等价类
下表列出了不同数据访问技术框架下 TransactionAwareDataSourceProxy 的等价类:
表 4. 不同数据访问框架 TransactionAwareDataSourceProxy 的等价类
?
小结
在本文中,我们通过剖析了解到以下的真相:
使用 Spring JDBC 时如果直接获取 Connection,可能会造成连接泄漏。为降低连接泄漏的可能,尽量使用 DataSourceUtils 获取数据连接。也可以对数据源进行代理,以便将其拥有事务上下文的感知能力; 可以将 Spring JDBC 防止连接泄漏的解决方案平滑应用到其它的数据访问技术框架中。?
?
?
【转载自:http://www.ibm.com/developerworks/cn/java/j-lo-spring-ts3/index.html】