1

像这样的@Singleton EJB:

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

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

  }

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

4

1 回答 1

1

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

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

带有附加实体的持久性上下文将在调用者之间共享

是的,同一个EntityManager实例是共享的。

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

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

因此,由于您具有只读操作,所以没关系,但您需要重新设计。

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

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

于 2013-03-12T05:19:09.410 回答