2011-10-24 93 views
0

我正在升級到運行postgres的現有系統。在春季交易系統中使用休眠會話工廠的地圖

以前的架構師認爲,在系統之外獲得更高性能的最佳方式是在每年之後將前幾年的數據移動到數據庫中的新模式,而不是簡單地索引主模式。 (嚴重的是,零指數,9個相同的模式)。

現在的問題。我刪除了他們正在使用的瘋狂數據庫連接邏輯(看起來他們試圖從頭構建一個事務管理器)並用Spring事務代替它。所以現在IM不得不面對這樣的循環:

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) 

(是的,我知道,這是一個多線程的Web應用程序,以前的開發者延緩)

我通常彈簧事務類我不因爲我假設春季交易管理者完成了這個任務,所以需要設置一個當前情景上下文。我在世界上如何解決這個混亂?

+1

您是否使用基於註解的方法?提供您定義sessionfactory的應用程序上下文部分。 – ManuPK

回答

0

Spring的HibernateTransactionManager不支持您的箱子,因爲它只能管理一個SessionFactory

因此,您可以爲不同的會話工廠擁有不同的事務管理器,但它們不能參與同一事務。如果沒關係,請參見10.5.6.2 Multiple Transaction Managers with @Transactional

否則,也許是爲了讓最簡單的方法你SessionFactories參與單個交易是使用JTATransactionManager與一些獨立的JTA實現(AtomikosBitronixJOTM)。

另外,請注意1PC優化的概念。我認爲JTA實現應該能夠應用於您的情況,以減少JTA引入的開銷。

0

感謝信息傢伙。我最終通過從交易管理器中分離出這些會話因素並手動管理交易來解決這個問題。多一點努力,但它的作品。

謝謝