我们目前正在使用JPA作为我们的数据访问层开发J2EE Web应用程序。我们目前正在采用几种不同的策略来在我们的应用程序中使用缓存。
EntityManager
EntityManager
我在Hibernate文档中看到了这两种策略。我的问题是哪个更广泛使用,如果我们每个会话执行EntityManager
,我们是否会在不同的请求线程中使用相同的EntityManager
来解决同步问题?
答案 0 :(得分:3)
更广泛使用的方法是为每个请求创建EntityManager
。但是这应该对你隐藏。您应该使用一些依赖注入机制(spring / CDI / EJB),它将注入放置EntityManager
的正确@PersistenceContext
。
如果您有兴趣如何在常见的情况下实现这一点,在这种情况下,您的bean是一些排序单例(一个无状态bean /一个范围单例的弹簧bean) - 容器实际上在目标对象中注入一个代理。每次查询代理时,它都会获得当前 EntityManager
实例,该实例(至少是spring)绑定到ThreadLocal
(=此请求)情况下)
更新:如果要在自行开发的框架中实现此功能,请使用cglib / javassist / JDK代理并将其注入@PersistenceContext
的位置。请求=线程。在每个需要数据访问权限的请求中,创建一个新的EntityManager
并将其存储在ThreadLocal
中。记得最后清理它,因为servlet容器重用了线程。从代理中,您可以获取当前的ThreadLocal
值。
但是如果你不是很喜欢这个项目,那么我建议你选择更稳定的东西,比如spring,cdi或guice。
答案 1 :(得分:0)
您使用的服务器是什么?它应该能够为您注入一个EntityManager,而不是要求应用程序处理它。