EntityManager
并不是线程安全的。EntityManager
注入到EJB中的@PersistenceContext
的行为类似于hread-safe,因为EJB容器将对EJB bean的访问序列化。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的映射堆栈。
答案 0 :(得分:1)
使用交易范围实体管理器的最大好处是 它是无状态的。这也使事务范围的EntityManager 线程安全,因此几乎免维护
JPA专业版书还说:
一个事务范围的实体管理器是无状态的,这意味着它可以 安全地存储在任何Java EE组件上