WEB开发网
开发学院软件开发Java 如何在Weblogic的全局事务执行多线程操作 阅读

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

 2009-09-22 00:00:00 来源:WEB开发网   
核心提示:今天有人提出了一个诡异的要求,要求在全局事务中执行多线程操作,如何在Weblogic的全局事务执行多线程操作,他们全局事务中涉及两个数据库中的多个表,如果单线程那么走完,用于将当前线程和指定的TX做关联,而internalSuspend()恰恰相反,相应时间上不满足要求,说白了就是比较慢

今天有人提出了一个诡异的要求,要求在全局事务中执行多线程操作。他们全局事务中涉及两个数据库中的多个表,如果单线程那么走完,相应时间上不满足要求,说白了就是比较慢,于是提出了这样的要求。从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()恰恰相反,它用于解除这种关联。

1 2 3 4  下一页

Tags:如何 Weblogic 全局

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接