我有2个数据源,在一个方法中,我需要从2个数据库中读写。数据库是PostgreSQL,我的EAR应用程序在wildfly-16上运行。
我无法以相同的方式使用2个数据库连接
好吧,我知道是因为系统无法跨其他数据库管理事务。
所以我拆分了ejb中的方法:
@TransactionAttribute(TransactionAttributeType.NEVER)
public Response mainMethod(String parameter) {
method1();
method2()
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void method1(){
...write on database 1...
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void method2(){
...write on database 2...
}
为什么我仍然遇到相同的错误?通话不是由两个不同的事务管理的吗?
ARJUNA012140: Adding multiple last resources is disallowed.
Trying to add LastResourceRecord(XAOnePhaseResource(LocalXAResourceImpl@594d9ba8[connectionListener=677e78 connectionManager=2a095926 warned=false currentXid=< formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffffc0a86e69:-9dc6f57:5d08b51e:f58, node_name=1, branch_uid=0:ffffc0a86e69:-9dc6f57:5d08b51e:f8a, subordinatenodename=null, eis_name=java:/jboss/datasource/db1 > productName=PostgreSQL productVersion=10.8 (Ubuntu 10.8-0ubuntu0.18.04.1) jndiName=java:/jboss/datasource/db1])),
but already have LastResourceRecord(XAOnePhaseResource(LocalXAResourceImpl@39fc2dc2[connectionListener=3724f31c connectionManager=39a995fb warned=false currentXid=< formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffffc0a86e69:-9dc6f57:5d08b51e:f58, node_name=1, branch_uid=0:ffffc0a86e69:-9dc6f57:5d08b51e:f64, subordinatenodename=null, eis_name=java:/jboss/datasource/db2 > productName=PostgreSQL productVersion=10.8 (Ubuntu 10.8-0ubuntu0.18.04.1) jndiName=java:/jboss/datasource/db2]))
答案 0 :(得分:1)
注释使用了动态代理,因此不适用于私有方法或内部调用的公共方法(在this
上)。您必须在不同的EJB中声明两个方法。
否则,您的错误,系统可以使用XA管理跨不同资源的交易。
只需将您的数据源之一切换到xa-datasource,就可以摆脱此问题。请注意,由于LLRTO,您在XA事务中可以有一个非xa数据源,但不能有两个(这就是arjuna错误的意思)。
答案 1 :(得分:-1)
嘿,万一有人在我这边遇到这个错误,我忘了关闭连接
finally {
call.closeAll();
}
这导致了错误:
Could not get a connection from the data source , Adding multiple last resources is disallowed.Current resource is org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource@17d3bab6