【问题标题】:ARJUNA012140: Adding multiple last resources is disallowedARJUNA012140:不允许添加多个最后资源
【发布时间】:2019-06-18 14:03:11
【问题描述】:

我有 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]))

【问题讨论】:

标签: java transactions wildfly jta


【解决方案1】:

注解在后台使用动态代理,因此不适用于私有方法或内部调用的公共方法(this)。您必须在不同的 EJB 中声明您的两个方法。

否则关于您的错误,系统可以使用 XA 管理跨不同资源的事务。

只需将您的数据源之一切换到 xa-datasource 即可解决问题。请注意,由于LLRTO,您可以在 XA 事务中拥有一个非 xa 数据源,但不能有两个(这就是 arjuna 错误的含义)。

【讨论】:

    【解决方案2】:

    嘿,以防万一有人在我这边遇到这个错误,我忘了关闭连接

    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
    

    【讨论】:

    • 这与 OP 的问题中的错误消息不同。你的回答似乎跑题了。如果我错了,请编辑并解释。谢谢。
    • @EricAya,这可能不是同一个场景,但我遇到了类似的问题,我用一个存储过程打开数据库连接,然后忘记关闭它,同一会话中的下一个过程尝试打开开放式连接因此它将第二个连接视为另一个数据库连接,但我的standalone.xml文件使用local-tx-database,因此它会引发此错误。
    猜你喜欢
    • 2021-10-08
    • 2016-10-08
    • 2016-11-04
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多