快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13

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

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

概述

对于应用开发者来说,数据连接泄漏无疑是一个可怕的梦魇。如果存在数据连 接泄漏问题,应用程序将因数据连接资源的耗尽而崩溃,甚至还可能引起数据库的崩溃。数据 连接泄漏像黑洞一样让开发者避之唯恐不及。

Spring DAO 对所有支持的数据访问技术 框架都使用模板化技术进行了薄层的封装。只要您的程序都使用 Spring DAO 模板(如 JdbcTemplate、HibernateTemplate 等)进行数据访问,一定不会存在数据连接泄漏的问题 ― ― 这是 Spring 给予我们郑重的承诺!因此,我们无需关注数据连接(Connection)及其衍生 品(Hibernate 的 Session 等)的获取和释放的操作,模板类已经通过其内部流程替我们完成 了,且对开发者是透明的。

但是由于集成第三方产品,整合遗产代码等原因,可能需要 直接访问数据源或直接获取数据连接及其衍生品。这时,如果使用不当,就可能在无意中创造 出一个魔鬼般的连接泄漏问题。

我们知道:当 Spring 事务方法运行时,就产生一个事 务上下文,该上下文在本事务执行线程中针对同一个数据源绑定了一个唯一的数据连接(或其 衍生品),所有被该事务上下文传播的方法都共享这个数据连接。这个数据连接从数据源获取 及返回给数据源都在 Spring 掌控之中,不会发生问题。如果在需要数据连接时,能够获取这 个被 Spring 管控的数据连接,则使用者可以放心使用,无需关注连接释放的问题。

那 么,如何获取这些被 Spring 管控的数据连接呢? Spring 提供了两种方法:其一是使用数据 资源获取工具类,其二是对数据源(或其衍生品如 Hibernate SessionFactory)进行代理。在 具体介绍这些方法之前,让我们先来看一下各种引发数据连接泄漏的场景。

Spring JDBC 数据连接泄漏

如果直接从数据源获取连接,且在使用完成后不主动归还给数据源 (调用 Connection#close()),则将造成数据连接泄漏的问题。

一个具体的实例

下面,来看一个具体的实例:

清单 1.JdbcUserService.java:主体代码

package user.connleak; import  org.apache.commons.dbcp.BasicDataSource; import org.springframework.beans.factory.annotation.Autowired; import  org.springframework.context.ApplicationContext; import  org.springframework.context.support.ClassPathXmlApplicationContext; import  org.springframework.jdbc.core.JdbcTemplate; import  org.springframework.stereotype.Service; import java.sql.Connection; @Service("jdbcUserService")  public class JdbcUserService {    @Autowired   private JdbcTemplate jdbcTemplate;   public  void logon(String userName) {     try {       // ①直接从 数据源获取连接,后续程序没有显式释放该连接       Connection conn =  jdbcTemplate.getDataSource().getConnection();       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();     }   } }

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

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

JdbcUserService 通过 Spring AOP 事务增强的配置,让所有 public 方法都 工作在事务环境中。即让 logon() 和 updateLastLogonTime() 方法拥有事务功能。在 logon () 方法内部,我们在①处

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