EntityManager线程安全性和Java EE

时间:2015-03-14 10:27:30

标签: multithreading hibernate java-ee ejb

我是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,或者当它不起作用时会有什么用例,是否安全?

1 个答案:

答案 0 :(得分:7)

  

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

两者都不是。 @Inject(以及@PersistenceContext@EJB)会注入代理实例,而非实际实例。

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

另见: