2010-04-06 41 views
17

我正在學習JPA並有一個問題:當我們需要多個EntityManager?

在哪些情況下我們需要在我們的應用程序中使用多個EntityManager?是

我所知道的兩種情況如下:

  • 當我們的應用程序是一個多線程應用程序和超過一個線程需要JPA事務,因爲EntityManager不是線程安全的,我們需要每個線程一個EntityManager

  • 當任何線程需要多個併發事務,我們需要一個以上的EntityManager在該線程因爲EntityManagerEntityTransaction之間一比一的關係。


Q1。當我們需要多個EntityManager時是否還有其他情況?

Q2。根據我的理解,每個Persitence Unit應該只有一個EntityManagerFactory。我對麼?如果不是,那麼當每個持久單元需要多個EntityManagerFactory時,那些情況是什麼?

回答

11

Q1:EntityManager最好與「好老」Hibernate Session:工作單元(簡單的商業行爲,例如「登錄用戶」,「下訂單」等)進行比較。它不一定綁定到單個線程。如果不同的線程執行在單個工作單元內相互依賴的數據庫任務,則只會遇到麻煩。您需要同步執行它們(最好是在單個線程中)。例如,如果您的業務需求是在用戶登錄時清理某些「舊日誌」(這合理地不會干擾彼此的信息),則可以在單個工作單元內以兩個單獨的線程完美執行它。第二季度:你的理解是正確的。但是,您可以創建多個,但這沒有任何意義,也沒有任何好處。這隻會增加很大的開銷。

+0

對於Q1:我估計一個_Entity Manager_對象應該具有最小的開銷,但我仍然渴望詢問有多少開銷:) 哇,互相依賴的diff線程更加複雜。那麼可以肯定地說,你應該每個線程有1個EM?然後你確保你捕獲任何異常,因爲你有多個線程使用同一個表,對吧? – thirdy 2011-12-28 04:34:15

+0

是的,因爲EM不是線程安全的,如果我爲它創建一個包裝並在內部調用EM的保存/更新的包裝器中包含'synchronized'保存/更新方法,它是否可以用於多個線程。我也永遠不清除/關閉EM?我認爲仍然存在同時讀寫的問題。您能否讓我知道您對此的評論? – bluelurker 2016-05-06 17:56:50

相關問題