EntityManager 线程安全和 Java EE

EntityManager thread safety and Java EE

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

通过下面的方式将Entity manager直接注入stateless 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 是否安全,或者当它不起作用时的用例是什么?

Would each stateless bean have its own instance of EntityManager or shared instance could be injected ?

None 两者。 @Inject(以及 @PersistenceContext@EJB)注入一个 proxy 实例,而不是实际实例。

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

另请参阅:

  • When using @EJB, does each managed bean get its own @EJB instance?
  • Why Stateless session beans?