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().

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


person Brandon    schedule 02.01.2009    source источник


Ответы (2)


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

person duffymo    schedule 02.01.2009
comment
com.microsoft.jdbc.sqlserver.SQLServerDriver и net.sourceforge.jtds.jdbc.Driver; Я не уверен, что это XA или нет. - person Brandon; 02.01.2009
comment
Нет, net.sourceforge.jtds.jdbcx.JtdsDataSource — это класс драйвера jTDS XA; см. msdn.microsoft.com/en-us/library/ aa342335(SQL.90).aspx для драйвера Microsoft XA. (Для последнего необходимо установить DLL.) - person duffymo; 02.01.2009
comment
Почему вы используете и jTDS, и драйверы Microsoft? Почему не только одно или другое? - person duffymo; 02.01.2009
comment
Это была работа, которая была раньше, но я не верю, что для этого есть причина. - person Brandon; 02.01.2009
comment
jTDS относится к чистому типу IV; для драйвера XA не требуются библиотеки DLL. - person duffymo; 02.01.2009

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

похожая проблема

person Lenymm    schedule 02.01.2013