JPA Web应用程序管理策略

时间:2010-12-11 21:12:01

标签: java hibernate jpa java-ee

我们目前正在使用JPA作为我们的数据访问层开发J2EE Web应用程序。我们目前正在采用几种不同的策略来在我们的应用程序中使用缓存。

  1. 每个请求创建一个EntityManager
    • 在请求范围内获取缓存,但在请求结束时丢失缓存
    • 可以轻松回滚整个请求中的任何更改
  2. 为每个Http会话创建一个EntityManager
    • 在会话范围内获取缓存
    • 使事务更复杂,必须为每个请求创建一个新事务,然后能够回滚每个请求的更改
  3. 我在Hibernate文档中看到了这两种策略。我的问题是哪个更广泛使用,如果我们每个会话执行EntityManager,我们是否会在不同的请求线程中使用相同的EntityManager来解决同步问题?

2 个答案:

答案 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,而不是要求应用程序处理它。