使用PersistenceContext和LockType.READ的singleton ejb

时间:2013-03-11 19:59:48

标签: java jpa ejb ejb-3.1

@Singleton这样的EJB:

  @Singleton
  public class MySingleton {
     @PersistenceContext
     private EntityManager em;
     ...

     @Lock(LockType.READ)
     public void doPersistanceAction() {
     }

  }

因此,MySingleton#doPersistanceAction()的所有调用者将同时使用相同的EntityManager实例。附加实体的持久化上下文将在调用者之间共享。由一个调用者启动的事务可能由另一个调用者提交。 ejb容器是否处理这种情况?

1 个答案:

答案 0 :(得分:1)

  

所以MySingleton#doPersistanceAction()的所有调用者都会使用相同的   EntityManager的实例同时

是的,但不是首选&不是线程安全的。相反,你应该注入EntityManagerFactory&然后在方法中,您可以从中获取EntityManager

  

与附加实体的持久化上下文将在之间共享   呼叫者

是的,共享EntityManager个实例。

  

由一个调用者启动的事务可能会被另一个调用者提交

LockType.READ:用于只读操作。只要没有保持WRITE锁,就允许同时访问指定为READ的方法。

因此,由于您具有只读操作,因此无关紧要,但您需要重新设计。

  

ejb容器是否处理了这种情况?

Container将负责singleton bean的初始化,注入,并发等,但你必须正确使用它。