快速业务通道

关于Weblogic中XAER_NOTA XAException的两种解释 - 编程入门网

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

关于Weblogic中XAER_NOTA XAException的两种解释

时间:2011-01-11 BlogJava 走走停停又三年

某些时候,在weblogic执行XA操作的时候,我们会碰到如下的错误:

java.sql.SQLException: Unexpected exception while enlisting XAConnection java.sql.SQLException: XA error: XAER_NOTA : The XID is not valid start() failed on resource ''weblogic.jdbc.jta.DataSource'': XAER_NOTA : The XID is not valid 

XAER_NOTA说明transaction branch在ResourceManager端(DB,MQ等)不存在。不存在通常由两种可能:transaction branch被timeout掉了,另外一种情况就是这个branch压根就没有在ResourceManager端发起过。

这篇文章主要针对2做一下说明,对于1,我们可以在Weblogic的XAConnectionPool设定中Enable XA Transaction Timeout,并对此设定一个合理的值,建议这个值比global transaction timeout大。这样weblogic在调用xaStart()的时候,会通知RM,该branch的timeout时间,而不是使用RM自己默认的timeout(对于Oracle,默认为60秒,但一般会在120秒的时候,tx branch才会被Oracle timeout掉)。

对于2, 一般会跟配置有关系,比如两个XA datasource指向同一个XAConnectionPool,或多个XAConnectionPool指向同一个Database,我们以多个datasource指向同一connection为例:

1:假如我们有如下的配置环境:

XADatasource_11---->XAPool_A---->Databse_A

XADatasource_21---->XAPool_B---->Databse_B

这样的配置环境中,我们做XA相关的操作是没有问题的。

1         public void xaTest() 2       { 3            try{ 4                UserTransaction tx = getUserTransaction(); 5                tx.setTransactionTimeout(1000); 6                tx.begin(); 7                Connection conn1 = getConnection("t3://localhost:7011",XADatasource_11); 8                Connection conn2 = getConnection("t3://localhost:7021",XADatasource_21); 9                this.executeInsertInPSMT(conn1,null); 10                this.executeAnoInsertInPSMT(conn2,null); 11                conn1.close(); 12                conn2.close(); 13                tx.commit(); 14            }catch(Exception e){} 15       }

2:如果基于业务需要,我们需要额外配置两个XA Datasource,分别指向 XAPool_A、XAPool_B,如下:

XADatasource_12----〉XAPool_A

XADatasource_22----〉XAPool_B

部署Datasource的时候,Weblogic会判断这个Datasource是不是XA类型的,如果是XA类型的Datasource,我们需要将这个datasource实例注册到Process- wide的resourceDescriptorList中,如下:

registerResource(poolName,(XAResource)driverInstance,registrationProperties);

在register前,我们先调用unregisterResource(poolName)将该poolName 对应的resource从 resourceDescriptorList中unregister掉。这样 XADatasource_12、XADatasource_22部署后,我们可以看到process-wide的 resourceDescriptorList中的对象变化:

部署前:XADatasource_11, XADatasource_21

部署后:XADatasource_12, XADatasource_22

注意:如果XADatasource11、12, XADatasource_21、22不存在多数据源 指向同连接池的话,部署后,四个Datasource应该都出现在 resourceDe

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