在spring事务系统中使用hibernate会话工厂的映射

时间:2011-10-24 13:19:53

标签: hibernate spring transactions

我正在升级到运行postgres的现有系统。

以前的架构师认为,从系统中获得改进性能的最佳方法是每年将前几年的数据移动到数据库中的新模式,而不是简单地索引主模式。 (严重的是,零索引,9个相同的模式)。

现在解决这个问题。我已经剥离了他们正在使用的疯狂的数据库连接逻辑(看起来他们试图从头开始构建一个事务管理器)并用Spring Transactions替换它。所以现在我被迫处理这样的循环:

for(archive a : yearsArchived){
  session s = sessionfactorymap.get(a).getcurrentsession();
  (find data and copy to temporary table for report)
}

我可以很容易地为不同的模式创建各种会话工厂,问题是将它们与事务管理器相关联,以便他们可以打开会话。当我把所有东西都改变后,我得到了这个例外:

org.hibernate.HibernateException: No CurrentSessionContext configured!
    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:685)
    at parity.model.ReportThread.generate(ReportThread.java:47)
    at parity.model.ReportThread.run(ReportThread.java:31)

(是的,我知道,它是一个多线程的网络应用程序,之前的开发人员都是延迟的)

在我的普通spring事务类中,我不需要设置currentsession上下文,因为我假设它是由spring事务管理器完成的。我怎么在世界上解决这个烂摊子?

2 个答案:

答案 0 :(得分:0)

Spring的HibernateTransactionManager不支持开箱即用的情况,因为它只能管理一个SessionFactory

因此,您可以为不同的会话工厂使用不同的事务管理器,但是它们不能参与同一事务。如果没问题,请参阅10.5.6.2 Multiple Transaction Managers with @Transactional

否则,让SessionFactories参与单个交易的最简单方法可能是JTATransactionManager使用一些独立的JTA实施(AtomikosBitronix,{{ 3}})。

另外,请注意 1PC Optimization 的概念。我认为JTA实现应该能够在您的情况下应用它,以减少JTA引入的开销。

答案 1 :(得分:0)

感谢信息人员。我最终通过从事务管理器中分离这些会话事件并手动管理事务来解决它。更多的努力,但它的工作。

感谢