快速业务通道

JAVA设计模式之事务处理 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
应用。首先,你有没有闻到代码重复的 bad smell?每次都要设置AutoCommit为false,然后提交,出现异常回滚,包装异常抛到上层,写多了不烦才怪,那能不能消除呢?其次,业务代表对象现在知道它内部事务管理的所有的细节,这与我们设计业务代表对象的初衷不符。对于业务代表对象来说,了解一个与事务有关的业务约束是相当恰当的,但是让它负责来实现它们就不太恰当了。再次,你是否想过嵌套业务对象的场景?业务代表对象之间的互相调用,层层嵌套,此时你又如何处理呢?你要知道按我们现在的方式,每个业务方法都处于各自独立的事务上下文当中(Transaction Context),互相调用形成了嵌套事务,此时你又该如何处理?也许办法就是重新写一遍,把不同的业务方法集中成一个巨无霸包装在一个事务上下文中。

我们有更为优雅的设计来解决这类问题,如果我们把Transaction Context的控制交给一个被业务代表对象、DAO和其他Component所共知的外部对象。当业务代表对象的某个方法需要事务管理时,它提示此外部对象它希望开始一个事务,外部对象获取一个连接并且开始数据库事务。也就是将事务控制从service层抽离,当web层调用service层的某个业务代表对象时,返回的是一个经过Transaction Context外部对象包装(或者说代理)的业务对象。此代理对象将请求发送给原始业务代表对象,但是对其中的业务方法进行事务控制。那么,我们如何实现此效果呢?答案是JDK1.3引进的动态代理技术。动态代理技术只能代理接口,这也是为什么我们需要业务接口BookStoreManager的原因。

首先,我们引入这个Transaction Context外部对象,它的代码其实很简单,如果不了解动态代理技术的请先阅读其他资料。

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import com.strutslet.demo.service.SystemException; public final class TransactionWrapper {    /**    * 装饰原始的业务代表对象,返回一个与业务代表对象有相同接口的代理对象    */    public static Object decorate(Object delegate) {      return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),          delegate.getClass().getInterfaces(), new XAWrapperHandler(              delegate));    }    //动态代理技术    static final class XAWrapperHandler implements InvocationHandler {      private final Object delegate;      XAWrapperHandler(Object delegate) {       this.delegate = delegate;      }      //简单起见,包装业务代表对象所有的业务方法      public Object invoke(Object proxy, Method method, Object[] args)          throws Throwable {        Object result = null;        Connection con = ConnectionManager.getConnection();        try {          //开始一个事务          con.setAutoCommit(false);          //调用原始业务对象的业务方法          result = method.invoke(delegate, args);          con.commit();  //提交事务          con.setAutoCommit(true);        } catch (Throwable t) {          //回滚          con.rollback();          con.setAutoCommit(true);          throw new SystemException(t);        }        return result;      }    } }

JAVA设计模式之事务处理(3)

时间:

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