我们目前正在使用JPA作为我们的数据访问层来开发J2EE Web应用程序。我们目前正在采用几种不同的策略来利用我们的应用程序中的缓存。
EntityManager
我已经在Hibernate文档中看到了这两种策略。我的问题是哪个使用更广泛,如果我们EntityManager按会话进行,是否会EntityManager在不同的请求线程中使用相同的同步问题?
更广泛使用的方法是创建EntityManager每个请求。但是,这应该对您隐藏。你应该使用一些依赖注入机制(春/ CDI / EJB),将注射合适的EntityManager地方@PersistenceContext放置。
@PersistenceContext
如果您对在某些情况下Bean是某种单例(一个无状态Bean /一个作用域单例的spring bean)的普通情况下如何实现这一点感兴趣,那么容器实际上会在目标对象中注入一个代理。并且每次查询代理时,它都会获取 当前 EntityManager实例,该实例(至少在spring的情况下)绑定到ThreadLocal(在这种情况下为request)
ThreadLocal
更新: 如果要在本地框架中实现此功能,请使用cglib / javassist / JDK代理并将其注入到@PersistenceContext放置位置。一个请求=线程。在每个需要数据访问的请求上,创建一个新请求EntityManager并将其存储在中ThreadLocal。记住最后要清理它,因为servlet容器会重用线程。从代理可以获取当前ThreadLocal值。
但是,如果您不熟悉该项目,那么我建议您改用更稳定的东西,例如spring,cdi或guice。