我正在使用緩存javax.naming.Context#lookup
調用結果的服務定位器實現,並將其映射到所請求的EJB接口,因此所有後續請求(對於同一個EJB)在第一個請求之後返回緩存實例。帶緩存的EJB服務定位器
我的擔憂是:
- 由於相同的情況下被使用,不存在 服務器EJB池這將成爲多個同時發生的請求 與多個EJB(除非底層服務器的邏輯不知何故使得利用 使用EJB池的)
- 無狀態和有狀態EJB是線程安全的,但由於再次使用 只有每個EJB類一個實例,EJB擁有的EntityManager 通過@PersistenceContext注入,我認爲MEA NS多個 線程可以使用相同的EntityManager實例(不僅僅是 持久化上下文),這絕對不是線程安全的
你認爲這是最好不要在服務定位器使用緩存,或我的擔心對EJB行爲是不合理的?
我已經證實了這一點,使用在相同的緩存實例與並行方法調用的測試 - 儘管參考EJB(存根如你所說)是一樣的,調試確認實際的EJB是不同的。我關心的仍然是不同的EJB使用相同的注入(通過@PersistenceContext)EntityManager實例。我無法確認100%這是線程安全的(因爲EntityManager本身不是線程安全的),但似乎合乎邏輯的是,由於它是容器管理的,它是 - 並且可能使用代理對象的相同原理來真正的新興市場。 – alterfox