2010-01-06 168 views
4

根據許多例子可以注入EntityManager到@Stateless或@Singleton的EJB這樣的:threadsafty如何保證@PersistenceContext?

@Stateless // or @Singleton 
public class MyRepository { 
    @PersistenceContext 
    private EntityManager em; 
    ... 
} 

的EJB 3.1規範說依賴注入是在施工時間只有進行,使所有呼叫者MyRepository將使用相同的EntityManager實例。 EJB容器如何確保使用正確的EntityManager實例?

+0

好問題...我經常想知道JEE5 +實現中的線程安全的細節。 – jsight 2010-01-06 18:31:05

回答

3

我的理解是一個@Stateless bean將永遠不會被兩個客戶端併發使用;如果需要爲多個客戶端服務,容器將簡單地創建同一個bean的更多實例。

至於@Singleton豆的spec說,在默認情況下,他們使用的容器管理的併發,其中容器使用方法Lock S和若單是忙碌可以拒絕客戶超時異常。

編輯:另外,@PersistentContext類型默認爲事務範圍(規範中爲16.11.1.1),因此在每個事務結束時分離所有由EntityManager管理的實體。

+0

我同意你的看法,雖然單身人士的鎖定可以自定義。但還有一點:注入只在bean創建時執行,然後由多個調用者使用(併發或不同時)。 – deamon 2010-01-06 20:25:33

+0

默認情況下,持久性上下文是事務範圍。 – 2010-01-06 21:17:45