EntityManager线程安全性和Java EE

Joh*_*ohn 3 multithreading hibernate ejb java-ee

我是EJB和hibernate的新手,以下让我感到困惑,因为每当我寻找明确的答案时似乎都会有矛盾.题:

以下列方式将实体管理器直接注入无状态bean是否可以线程安全?

@Stateless
public class SomeBean implements SomeInterface {

//..    
@Inject
private EntityManager entityManager;

//... non related transaction1()
//... non related transaction2()
Run Code Online (Sandbox Code Playgroud)

EntityManager是否可以注入每个无状态bean都有自己的实例或共享实例?

根据Hibernate文档:

一个EntityManager是应该被使用一次,单个业务流程的廉价,非线程安全的对象,一个工作单位,然后丢弃.

EJB容器是否使其线程安全?

根据EJB文档,无状态会话bean本身就是线程安全的,因为不允许不同的客户端同时在同一个bean上运行.

然而,我看过的例子中,EntityManagerFactory应注射代替EntityManager,如果EntityManager直接注射应在状态bean来完成.

总是将EJB直接注入无状态bean(如上所示)或者什么是无用的情况下是否安全?

Bal*_*usC 7

是否每个无状态bean都有自己的EntityManager实例或共享实例可以注入?

两者都不是.在@Inject(和@PersistenceContext@EJB)注入一个代理服务器实例,而不是实际的实例.

代理将在每个方法上调用委托给当前线程和上下文中的正确可用实例.换句话说,容器担心这一切,而不是你.

也可以看看: