首页 / 软件开发 / JAVA / 关于Weblogic中XAER_NOTA XAException的两种解释
关于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_AXADatasource_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_AXADatasource_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应该都出现在 resourceDescriptorList中。