Ошибка получения соединений в 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 или что-то подобное?
Примечание. Этот вопрос был изменен после того, как баунти началось на основе дополнительного открытия, чтобы заострить внимание на конкретной проблеме и удалить другие возможности, которые были исключены.
Ответы
Ответ 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.