HibernateTransactionManager (Spring) с несколькими фабриками сеансов

У меня есть реализация DAO, которая использует HibernateTransactionManager для управления транзакциями, а приложение имеет 2 фабрики сеансов. Я получаю исключение в строке transactionManager.commit () ниже. Вызывает ли проблемы выполнение операций Hibernate в диспетчере транзакций, относящемся к другой фабрике сеансов?

TransactionStatus status = transactionManager.getTransaction(def);
try{
    doHibernateStuff1();  //Does Hibernate stuff with session
                          //factory related to Tx Manager
    doHibernateStuff2();  //Does Hibernate stuff with session 
                          //factory not related to Tx Manager
}
catch(DataAccessException){
 transactionManager.rollback(status);
}
transactionManager.commit(status); //Exception happens here.

Исключением является попытка снова выполнить операции в doHibernateStuff2(); в txManager.commit().

Если вы хотите предложить кладж и / или правильный способ справиться с этим, я был бы признателен.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
4 256
2

Ответы 2

Используете ли вы драйверы XA для подключения к двум источникам данных, участвующим в транзакции? Иначе работать не может.

com.microsoft.jdbc.sqlserver.SQLServerDriver и net.sourceforge.jtds.jdbc.Driver; Не уверен, что это XA или нет.

Brandon 02.01.2009 20:47

Нет, net.sourceforge.jtds.jdbcx.JtdsDataSource - это класс драйвера jTDS XA; см. msdn.microsoft.com/en-us/library/aa342335(SQL.90).aspx для драйвера Microsoft XA. (Для последнего вам необходимо установить DLL.)

duffymo 02.01.2009 20:57

Почему вы используете драйверы jTDS и Microsoft? Почему не одно или другое?

duffymo 02.01.2009 21:03

Это была работа, которая была раньше, но я не думаю, что для этого есть причина.

Brandon 02.01.2009 21:15

jTDS - чистый тип IV; для драйвера XA не требуются библиотеки DLL.

duffymo 02.01.2009 21:47

Я знаю, что это старый вопрос, но я столкнулся с аналогичной проблемой. Я предполагаю, что у Брэндона есть 2 сеанса фабрики для разные источники данных, а он использует HibernateTransactionManager. И я считаю, что использование такого менеджера - проблема. Из того, что я читал, HibernateTransactionManager не может работать с двумя разными фабриками сеансов. Вместо этого ему следует использовать другой менеджер, например менеджер транзакций JTA. Но только если ему нужен доступ к обоим источникам данных в одной транзакции. В противном случае решение должно использовать дополнительный менеджер для каждой фабрики сеансов, как указано в приведенной ниже ссылке:

аналогичная проблема

Другие вопросы по теме