快速业务通道

如何在Weblogic的全局事务执行多线程操作 - 编程入门网

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

如何在Weblogic的全局事务执行多线程操作

时间:2010-12-24 BlogJava 走走停停又三年

今天有人提出了一个诡异的要求,要求在全局事务中执行多线程操作。他们 全局事务中涉及两个数据库中的多个表,如果单线程那么走完,相应时间上不满 足要求,说白了就是比较慢,于是提出了这样的要求。从JTA的规范来看, transaction(TX)和thread是密切相关的,TX一般是不能在应用线程间传递的, 即我主线程起一个全局事务,然后我把这个事务传递给其他我新起的线程,单纯 的变量传递没问题,但这个事务是不能被transaction manager(TM)识别的,TM 对TX的管理有他自己的方式。从weblogic的实现来看,TX被放在当前线程的 threadlocal中,普通应用线程不存在这样的结构,所以简单的变量传递,对于 TM而言是没有意义的。那么到底有没有方法实现上面的需求的,我做了些测试, 使用weblogic内部的一些API可以实现这个需求。下面我们就来看看实现中的几 个要点: :)

1:上面说了,简单的变量传递对于weblogic的TM是没有意义的。TM判断事务 上下文(transaction context)的时候,会从当前线程的threadlocal检查,如果 没有,则说明当前线程没有和任何TX关联。那么我们如何将我们手里的TX放入当 前线程的threadlocal呢? weblogic的ExecuteThread是我们需要的那种线程, 但它是final的,我们不能继承它,只能继承它的父类了,也就是 weblogic.kernel.AuditableThread。

2:我们有继承了AuditableThread,那么我们怎么把TX放入它的threadlocal 中呢?这个可以通过weblogic的TM实现中的一些API来实现,具体到这个类就是 weblogic.transaction.internal.TransactionManagerImpl。比如 interResume(tx),internalSuspend()。由于这个API不是package protect的, 我们自己的类必须也位于weblogic.transaction.internal这个包中。 interResume(tx),用于将当前线程和指定的TX做关联,而internalSuspend()恰 恰相反,它用于解除这种关联。

3:因为涉及到多线程,主线程需要决定何时提交或回滚事务,这个我们要自 己要实现一个线程结果检查的方法(checkCompletion())。

下面就是我自己实现的测试代码,在Weblogic81测试没有问题。

1 package weblogic.transaction.internal; 2 3 import weblogic.transaction.TxHelper; 4 import  weblogic.transaction.internal.TransactionManagerImpl; 5 import  javax.transaction.Transaction; 6 import  java.util.ArrayList; 7 8 public class DriverTest  { 9 10     private static String INITIAL_CONTEXT_FACTORY  = "weblogic.jndi.WLInitialContextFactory"; 11     private  static String PROVIDER_URL = "t3://localhost:8001"; 12      private static String SQL_INSERT = "insert into test values (?)"; 13     private static String ANO_SQL_INSERT =  "insert into test1 values(?)"; 14 15     public  static void main(String args[]) 16     { 17          DriverTest test = new DriverTest(); 18          test.multiThreadXATest(); 19     } 20 21      private Connection getConnection(String url, String dsName)  throws NamingException, SQLException 22     { 23          InitialContext ctx = initializeEnv(url); 24          DataSource ds = (DataSource)ctx.lookup(dsName); 25          ctx.close(); 26         return  ds.getConnection(); 27  

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