【问题标题】:HibernateTransactionManager(Spring) with multiple Session Factories具有多个会话工厂的 HibernateTransactionManager(Spring)
【发布时间】:2009-01-02 17:29:28
【问题描述】:

我有一个使用 HibernateTransactionManager 进行事务管理的 DAO 实现,并且该应用程序有 2 个会话工厂。我在下面的 transactionManager.commit() 行中遇到异常。 在与不同会话工厂相关的事务管理器中执行休眠操作会导致问题吗?

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.

异常似乎是试图在txManager.commit() 中再次执行doHibernateStuff2(); 中的操作。

如果您想提出解决方法和/或适当的方法,我将不胜感激。

【问题讨论】:

    标签: java hibernate spring transactions


    【解决方案1】:

    您是否使用 XA 驱动程序连接到事务中涉及的两个数据源?否则无法工作。

    【讨论】:

    • com.microsoft.jdbc.sqlserver.SQLServerDriver 和 net.sourceforge.jtds.jdbc.Driver;我不确定这些是否是 XA。
    • 否,net.sourceforge.jtds.jdbcx.JtdsDataSource 是 jTDS XA 驱动类;有关 Microsoft 的 XA 驱动程序,请参阅 msdn.microsoft.com/en-us/library/aa342335(SQL.90).aspx。 (你必须为后者安装 DLL。)
    • 您为什么同时使用 jTDS 和 Microsoft 驱动程序?为什么不只是其中一个?
    • 这是以前的工作,但我不相信这是有原因的。
    • jTDS 是纯 IV 型; XA 驱动程序不需要 DLL。
    【解决方案2】:

    我知道这是一个老问题,但我遇到了类似的问题。我假设 Brandon 有 2 个会话工厂 用于不同的数据源,并且他正在使用 HibernateTransactionManager。而且我相信使用这样的经理是问题所在。从我读过的内容来看,HibernateTransactionManager 无法使用 2 个不同的会话工厂。相反,他应该使用不同的管理器,例如 JTA 事务管理器。但前提是他需要在一个事务中访问两个数据源。否则,解决方案应该为每个会话工厂使用额外的管理器,如下面的链接中提到的:

    similar problem

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 2016-11-27
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多