快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
);    Statement stmt = null;   try {     Connection conToUse =  con;     …     handleWarnings(stmt);     return  result;   }   catch (SQLException ex) {      JdbcUtils.closeStatement(stmt);     stmt = null;      DataSourceUtils.releaseConnection(con, getDataSource());     con =  null;     throw getExceptionTranslator().translate(        "StatementCallback", getSql(action), ex);   }   finally {     JdbcUtils.closeStatement(stmt);     //② 最后根据DataSourceUtils 释放数据连接     DataSourceUtils.releaseConnection(con, getDataSource ());   } }

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

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

在 ① 处通过 DataSourceUtils.getConnection() 获 取连接,在 ② 处通过 DataSourceUtils.releaseConnection() 释放连接。所有 JdbcTemplate 开放的数据访问方法最终都是通过 execute(StatementCallback<T> action)执行数据访问操作的,因此这个方法代表了 JdbcTemplate 数据操作的最终实现方式。

正是因为 JdbcTemplate 严谨的获取连接,释放连接的模式化流程保证了 JdbcTemplate 对数据连接泄漏问题的免疫性。所以,如有可能尽量使用 JdbcTemplate, HibernateTemplate 等这些模板进行数据访问操作,避免直接获取数据连接的操作。

使 用 TransactionAwareDataSourceProxy

如果不得已要显式获取数据连接,除了使用 DataSourceUtils 获取事务上下文绑定的连接外,还可以通过 TransactionAwareDataSourceProxy 对数据源进行代理。数据源对象被代理后就具有了事务上 下文感知的能力,通过代理数据源的 getConnection() 方法获取的连接和使用 DataSourceUtils.getConnection() 获取连接的效果是一样的。

下面是使用 TransactionAwareDataSourceProxy 对数据源进行代理的配置:

清单 11.applicationContext.xml:对数据源进行代理

<bean  id="dataSource"   class="org.apache.commons.dbcp.BasicDataSource"    destroy-method="close"    p:driverClassName="oracle.jdbc.driver.OracleDriver"    p:url="jdbc:oracle:thin:@localhost:1521:orcl"   p:username="test"    p:password="test"   p:defaultAutoCommit="false"/> <!-- ① 对数据源进行代理--> <bean id="dataSourceProxy"    class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"    p:targetDataSource-ref="dataSource"/> <!-- ②直接使用数据源的代 理对象--> <bean id="jdbcTemplate"    class="org.springframework.jdbc.core.JdbcTemplate"   p:dataSource- ref="dataSourceProxy"/> <!-- ③直接使用数据源的代理对象--> <bean id="jdbcManager"    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"    p:dataSource-ref="dataSourceProxy"/>

对数据源进行代理后,我们就可以 通过数据源代理对象的 getConnection() 获取事务上下文中绑定的数据连接了。

因此 ,如果数据源已经进行了 TransactionAwareDataSourceProxy 的代理,而且方法存在事务上下 文,那么清单 1 的代码也不会生产连接泄漏的问题。

其它数据访问技术的等价类

理解了 Sp

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