EntityManager
不是线程安全的。EntityManager
注入的@PersistenceContext
的行为类似于hread-safe,因为EJB容器序列化了对EJB bean的访问。但是:
当我通过@PersistenceContext
将EntityManager
注入到CDI bean中并直接使用这个bean时,例如在Servlet中,会发生什么情况?我认为这个EntityManager
是一个代理,那么这个代理能保证线程安全吗?
编辑:类似的问题不能解决我的问题,因为accepted显示的是EJB示例,而不是CDI示例。
编辑:我查看了WildFly应用服务器的源代码,发现WildFly使用了线程安全的代理。此代理在需要时选择实际的EntityManager。在ThreadLocal中,真正的EntityManagers保存在EntityManagers地图的特殊结构堆栈中。
发布于 2018-10-02 21:52:48
使用事务作用域实体管理器的最大好处是它是无状态的。这也使得事务作用域为EntityManager线程安全,因此实际上无需维护
另外,pro JPA的书中说:
事务范围的实体管理器是无状态的,这意味着它可以安全地存储在任何Java组件
上
https://stackoverflow.com/questions/52595948
复制相似问题