ARJUNA012140: добавление нескольких последних ресурсов запрещено - PullRequest
1 голос
/ 18 июня 2019

У меня есть 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]))

1 Ответ

1 голос
/ 18 июня 2019

Аннотации используют динамические прокси под оболочкой и поэтому не работают ни с приватными методами, ни с публичными, вызываемыми внутри (на this).Вы должны объявить два своих метода в разных EJB-компонентах.

В противном случае в отношении вашей ошибки система может управлять транзакциями через разные ресурсы с помощью XA.

Просто переключите один из вашихисточники данных в xa-datasource, и вы избавитесь от проблемы.Обратите внимание, что вы можете иметь один источник данных не-xa в транзакции XA благодаря LLRTO , но не два (это означает ошибку arjuna).

...