[英]EntityManager thread safety and Java EE
我是EJB和hibernate的新手,以下讓我感到困惑,因為每當我尋找明確的答案時似乎都會有矛盾。 題:
以下列方式將實體管理器直接注入無狀態bean是否可以線程安全?
@Stateless
public class SomeBean implements SomeInterface {
//..
@Inject
private EntityManager entityManager;
//... non related transaction1()
//... non related transaction2()
是否每個無狀態bean都有自己的EntityManager
或共享實例可以注入?
根據Hibernate文檔:
EntityManager
是一個廉價的,非線程安全的對象,應該只使用一次,用於單個業務流程,單個工作單元,然后丟棄。
EJB容器是否使其線程安全?
根據EJB文檔,無狀態會話bean本身就是線程安全的,因為不允許不同的客戶端同時在同一個bean上運行。
但是,我看了例子,其中EntityManagerFactory
應注射代替EntityManager
如果EntityManager
直接注入,應該在狀態bean來完成。
總是將EJB直接注入無狀態bean(如上所示)或者什么是無用的情況下是否安全?
是否每個無狀態bean都有自己的EntityManager實例或共享實例可以注入?
兩者都不是。 @Inject
(和@PersistenceContext
和@EJB
)注入代理實例,而不是實際實例。
代理將在每個方法上調用委托給當前線程和上下文中的正確可用實例。 換句話說,容器擔心這一切,而不是你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.