通过Java EE应用程序服务器中的CDI中的@PersistenceContext获取EntityManager吗?

时间:2018-10-01 17:21:06

标签: jpa java-ee thread-safety ejb cdi

  • 我知道自己实例化的EntityManager并不是线程安全的。
  • 我知道通过EntityManager注入到EJB中的@PersistenceContext的行为类似于hread-safe,因为EJB容器将对EJB bean的访问序列化。
  • 我知道在EJB中注入的EntityManager实际上是代理。
  • 我知道,当我通过EntityManager注入@PersistenceContext@Dependent CDI bean并将该bean注入EJB时,由于涵盖了EJB,它的行为就像线程安全的一样(我相信这种情况EntityManager也是代理人。)

但是:

  • 当我通过EntityManager向CDI bean注入@PersistenceContext并直接在Servlet中使用该bean时会发生什么?我相信这个EntityManager是代理,那么这个代理可以保证线程安全吗?

编辑:类似的问题Java CDI @PersistenceContext and thread safety不能解决我的问题,因为公认的答案显示的是EJB示例,而不是CDI示例。

编辑:我检查了WildFly应用程序服务器的源代码,看起来WildFly在CDI中使用了线程安全代理。需要时,此代理选择真实的EntityManager。实际的EntityManager保留在特殊的结构中-ThreadLocal中EntityManager的映射堆栈。

1 个答案:

答案 0 :(得分:1)

https://www.javacodegeeks.com/2013/06/jpa-2-entitymanagers-transactions-and-everything-around-it.html说:

  

使用交易范围实体管理器的最大好处是   它是无状态的。这也使事务范围的EntityManager   线程安全,因此几乎免维护

JPA专业版书还说:

  

一个事务范围的实体管理器是无状态的,这意味着它可以   安全地存储在任何Java EE组件上