java - 带有 PersistenceContext 和 LockType.READ 的单例 ejb

标签 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容器是否处理这种情况?

最佳答案

So all callers of MySingleton#doPersistanceAction() would use the same instance of EntityManager simultaneously

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

And persistence context with attached entitys will share between callers

是的,相同的 EntityManager 实例是共享的。

And transaction started by one caller may be commited by another

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

因此,由于您具有只读操作,因此应该没有关系,但您需要重新审视设计。

Whether the ejb container handle such a situation?

容器将负责单例bean的初始化、注入(inject)、并发等,但你必须正确使用它。

关于java - 带有 PersistenceContext 和 LockType.READ 的单例 ejb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15347479/

相关文章:

JavaMail SSL 无论如何都没有身份验证信任证书

java - EJB 是否适合游戏服务器?

java - TomEE 中的 ManagedScheduledExecutorService

java - 无法在自定义 Spring validator 中 @Autowire 依赖项

java - 获取异常是 java.net.SocketException : Connection reset

java - 错误 : The given id must not be null for GeneratedValue in JPA

JPA 连接父/子@OneToMany 的表名

java - 我可以实现自己的 JPA 吗?

java - JAX-WS(TomEE) Web 服务构造函数仅运行一次

java - 根据对象属性对对象数组列表进行排序