实体管理器的线程安全性和Java EE

3

我是一名新手,对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,则应该在Stateful bean中执行。
是否总是像上面展示的那样直接将EJB注入无状态bean是安全的,还是什么情况下不能工作?
1个回答

8

那么,如果有10个线程调用同一个事务服务,每个线程都会有自己的实体管理器吗? - John
如果有10个线程在调用一个注入的EntityManager方法,那么是的。 - BalusC
1
@BalusC:在servlet中注入EntityManager怎么样?它仍然是一个线程安全的代理吗? - Mike Argyriou
1
@BalusC: 但是当带有实例变量entityManager的同一个无状态Bean被返回到池中时,先前用户留下的状态将对下一个用户可见/可用。这能算是线程安全吗? - Farhan stands with Palestine
1
@Shirgill:正如答案所述,@PersistenceContext也会注入一个代理。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接