关于Weblogic中XAER_NOTA XAException的两种解释
2009-09-22 00:00:00 来源:WEB开发网某些时候,在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 }
更多精彩
赞助商链接