在 jboss 中检索到多个数据库的连接时出错,即使没有事务也是如此

2022-09-03 18:17:18

我们正在从 JBoss 6 升级到 JBoss 7。我们应用程序的性质为每个客户都有一个单独的数据库实例,以及一个所有客户通用的核心配置数据库。我们通常有EJB代码,它至少会在一次调用中引用核心数据库以及单个客户的数据,甚至是一些遍历所有客户的一般后台流程。

在 JBoss 6 中,通过设置具有 NOT_SUPPORTED 事务属性的方法,可以毫无问题地处理这个问题。但是,JBoss 7 对此抱怨,并出现以下错误:

ARJUNA012140:不允许添加多个最后的资源。尝试添加 LastResourceRecord(XAOnePhaseResource(LocalXAResourceImpl@74bec54d[connectionListener=d3ce980 connectionManager=25b47a05 warned=false currentXid=< formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:11, node_name=1, branch_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:14, 从属节点名称=null, eis_name=未知 eis name >]),但已经有 LastResourceRecord(XAOnePhaseResource(LocalXAResourceImpl@518d0191[connectionListener=1a05d94a connectionManager=135f1cfe warn=false currentXid=< formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:11, node_name=1, branch_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:13, 从属节点名称=null, eis_name=未知 eis 名称 >]))

我们如何解决这个问题,而不将每个对不同数据库的调用包装在单独的EJB调用和事务中。有没有办法在EJB调用或类似的东西中实际关闭JBoss事务管理?

注意:在赏金开始后,根据额外的发现修改了这个问题,以突出对特定问题的关注并消除排除的其他可能性。


答案 1

两个建议:

  1. 请考虑将数据源更新为其 XA 等效项。这将解决您的所有问题。我怀疑你在这里受到阻碍?
  2. 请考虑在服务器 conf 中设置为 true。这将允许你想要的行为,但不幸的是,对于整个应用程序,而不仅仅是方法。com.arjuna.ats.arjuna.allowMultipleLastResources

更新:

我不建议启用多个单阶段资源,因为它会大大削弱应用的事务属性。但是如果你想在 JBoss 7 中执行此操作,则需要修改并添加:standalone.xml

<system-properties>
        <property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/>
</system-properties>

您现在有一个系统,它与没有交易的系统相距不远。不过,它仍然会做的是,如果你得到启发式的结果,它会警告你。

如果可以的话,我的建议仍然是使用XA数据源。

更新 2:

哦,如果有人来阅读这篇文章,我想补充一点,如果你能将代码分成不同的方法,与OP不同,我建议你重构你的代码并用于创建并行事务。这比打开多个1PC要好,尽管不如打开XA好。@TransactionAttribute(REQUIRES_NEW)


答案 2

好吧,事实证明,与 JBoss6 不同,就检索数据源的验证逻辑而言,NOT_SUPPORTED事务仍然是事务。

解决此问题的方法是使整个 EJB 成为 Bean 管理的事务:

@TransactionManagement(TransactionManagementType.BEAN)

不幸的是,这限制了一些灵活性,因为有时您宁愿逐种方法控制这种方法,但这并不是一个太痛苦的解决方法。


推荐