2011-01-13 46 views
4

我工作的一種使用Hibernate3和JDBC連接項目交易/互動(MSSQL 2008)Hibernate的會話與線程

目前我們在主類創建我們的會話工廠,然後開始我們的交易,那麼我們開始一個新的線程,該線程創建連接,而不是。我會看看,如果我可以用一些僞代碼說明這一點...

public static main(String[] args){ 
    for(...){ 
     SessionFactory sf = new SessionFactory(); 
     sf.getCurrentSession.beginTransaction(); 
     CreateNewThreadedObject.run(); 
     sf.getCurrentSession.getTransaction.commit(); 
    } 
} 

我的問題是,這是安全的嗎?我知道會話不是線程安全的,但我沒有真正在線程中使用會話。如果有什麼我使用的交易。將sessionfactory傳遞給線程對象會更好嗎?任何建議表示讚賞!

+0

如果您在衍生線程中使用事務(以便線程執行的操作可以是在main中啓動的事務的一部分),那麼這可能會失敗,因爲主事務可以在派生線程完成其工作單元之前提交它 – 2011-01-13 20:50:17

回答

2

您可以初始化一個單例SessionFactory。這實際上是建議的。

然後,每個線程應該使用會話工廠創建一個會話並執行事務。

這實際上是Web應用程序中使用的一種非常常見的模式。 @kvista提到的Open View in View模式基本上是一個servlet過濾器,它創建一個會話,開始一個事務,委託給繼續進行請求處理的任何事物,並在最後提交或回滾事務。由於每個請求都由一個servlet容器中的不同線程處理,因此您可以看到兩種情況有多接近。

就你而言,在每個線程中執行多個事務並不是不合理的。這實際上是在多線程(理想情況下爲JTA)環境中執行批處理流程的基本思路。但是應該注意的一件事是,會話實際上是一個持久性上下文,它充當緩存,您應該不時清除它以避免內存泄漏。

相關問題