在JBoss 6中,这是通过使用NOT_SUPPORTED事务属性设置方法来处理的.但是,JBoss 7抱怨有以下错误:
ARJUNA012140: Adding multiple last resources is disallowed. Trying to
add
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,
subordinatenodename=null,eis_name=unknown eis name >])),but already
have
LastResourceRecord(XAOnePhaseResource(LocalXAResourceImpl@518d0191[connectionListener=1a05d94a
connectionManager=135f1cfe warned=false currentXid=< formatId=131077,
branch_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:13,eis_name=unknown eis name >]))
我们如何解决这个问题,而不必在单独的EJB调用和事务中将每个调用包裹到不同的数据库.有没有办法在EJB调用或类似的事情中实际关闭JBoss事务管理?
解决方法
考虑将数据源更新为XA等价物.这将解决您的所有问题.我怀疑你在这里受到阻碍?
>考虑在服务器conf中设置com.arjuna.ats.arjuna.allowMultipleLastResources为true.这将允许你想要的行为,但不幸的是整个应用程序,而不仅仅是方法.
更新:
我不建议启用多个单阶段资源,因为它会大大削弱您的应用程序的事务属性.但是如果要在JBoss 7中执行此操作,则需要修改standalone.xml并添加:
<system-properties> <property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/> </system-properties>
你现在拥有一个没有交易的系统.仍然会做什么,是警告你,如果你有启发式的结果.
我的建议仍然是使用XA数据源,如果可以的话.
更新2:
哦,如果有人来读这个,我想补充一点,如果你可以将代码分成不同的方法,与OP不同,我建议重构代码,并使用@TransactionAttribute(REQUIRES_NEW)来创建并行事务.这比打开多个1PC更好,尽管不如开启XA.