2013-02-27 73 views
0

我堅持通過多個連接到數據庫的實體。處理持久化的類實現了可運行接口,並且我在run()方法中創建了EntityManagers。在閱讀this之後,我想知道是否最好在類構造函數或靜態初始化塊中初始化EntityManagerFactory。在多線程環境中初始化EntityManagerFactory

+0

我認爲需要注入EntityManagerFactory,然後在每個線程中創建一個新的EntityManager,因爲您的應用程序也需要線程安全,這也是我用於類似需求的解決方案。 – 2013-02-27 23:34:02

回答

1

我假設你在Java SE中使用JPA而不是Java EE。此外,我認爲你有一個類來處理你的實體的持久性 - 當你要求類構造函數靜態初始化時,你的意思是這個類。此外,我假設你所有的多連接都是針對同一個數據庫的......我假設你不重用你的實例:既不是你的實例,也不是你的可運行類實例。

如果假設是正確的,那麼我寧願初始化EntityManagerFactory,要麼是對可運行類進行靜態初始化,要麼是以單例實現的第二個類。

如果在可運行類的類構造函數中創建EntityManagerFactory,則每個實例(即每個線程)都有一個工廠。這是可能的,但不必要,因爲對於多個邏輯相同的EntityManager實例,您只需要一個EntityManagerFactory

另一個問題是在哪裏創建EntityManager本身:在類的構造函數中(允許您在啓動線程的早期捕獲錯誤)或者在方法run中。個人而言,我寧願run - 方法,因爲它允許您創建和關閉在該EntityManager在使用try/finally)同樣的方法

警告:要知道,你有多個線程之間沒有任何交易。