Подтвердить что ты не робот

Ошибка получения соединений в jboss для нескольких баз данных, даже если транзакция отсутствует

Мы находимся в процессе перехода от JBoss 6 к JBoss 7. Характер нашего приложения имеет отдельный экземпляр базы данных для каждого клиента, а также базовую конфигурационную базу данных, общую для всех клиентов. У нас часто есть EJB-код, который, по крайней мере, будет ссылаться на базовую базу данных, а также на отдельные данные клиента в один звонок и даже на некоторые общие фоновые процессы, которые проходят через всех клиентов.

В JBoss 6 это было обработано без проблем, установив метод с атрибутом транзакции NOT_SUPPORTED. Однако JBoss 7 жалуется на это со следующей ошибкой:

ARJUNA012140: добавление нескольких последних ресурсов запрещено. Попытка Добавить LastResourceRecord (XAOnePhaseResource (LocalXAResourceImpl @74bec54d [connectionListener = d3ce980 connectionManager = 25b47a05 warned = false currentXid = < formatId = сто тридцать одна тысяча семьдесят семь, 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 > ])), но уже иметь LastResourceRecord (XAOnePhaseResource (LocalXAResourceImpl @518d0191 [connectionListener = 1a05d94a connectionManager = 135f1cfe warned = false currentXid = < formatId = сто тридцать одна тысяча семьдесят семь, gtrid_length = 29, bqual_length = 36, tx_uid = 0: ffff0a2c28d1: -5a4c1f9a: 504689c9: 11, node_name = 1, branch_uid = 0: ffff0a2c28d1: -5a4c1f9a: 504689c9: 13, subordinatenodename = null, eis_name = unknown eis name > ]))

Как мы можем обойти эту проблему без переноса каждого вызова в разные базы данных в отдельном вызове и транзакции EJB. Есть ли способ фактически отключить управление транзакциями JBoss в вызове EJB или что-то подобное?

Примечание. Этот вопрос был изменен после того, как баунти началось на основе дополнительного открытия, чтобы заострить внимание на конкретной проблеме и удалить другие возможности, которые были исключены.

4b9b3361

Ответ 1

ОК, выясняется, что в отличие от JBoss6 транзакция NOT_SUPPORTED по-прежнему является транзакцией в отношении логики проверки для извлечения источников данных.

Способ обойти это - сделать всю транзакцию EJB a bean:

@TransactionManagement(TransactionManagementType.BEAN)

Это, к сожалению, ограничивает некоторую гибкость в том, что несколько раз вы предпочитаете контролировать этот метод за другим, но это не слишком больно. Обходной путь.

Ответ 2

Два предложения:

  • Рассмотрите возможность обновления источников данных к их эквивалентам XA. Это решит все ваши проблемы. Я подозреваю, что вам мешают здесь?
  • Рассмотрим настройку com.arjuna.ats.arjuna.allowMultipleLastResources на true в сервере conf. Это позволит выполнить поведение, которое вы хотите, но, к сожалению, для всего приложения, а не только для этого метода.

Update:

Я не рекомендую включать несколько однофазных ресурсов, так как существенно снижает транзакционные свойства вашего приложения. Но если вы хотите сделать это в 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.