一尘不染

JPA Web应用程序管理策略

hibernate

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

  1. 创建EntityManager每个请求
    • 在请求范围内获取缓存,但在请求结束时丢失缓存
    • 轻松回滚整个请求中的任何更改
  2. 创建EntityManager每个Http会话
    • 在会话范围内获取缓存
    • 使事务变得更复杂,必须按请求创建一个新事务,然后才能按请求回滚更改

我已经在Hibernate文档中看到了这两种策略。我的问题是哪个使用更广泛,如果我们EntityManager按会话进行,是否会EntityManager在不同的请求线程中使用相同的同步问题?


阅读 231

收藏
2020-06-20

共1个答案

一尘不染

更广泛使用的方法是创建EntityManager每个请求。但是,这应该对您隐藏。你应该使用一些依赖注入机制(春/ CDI /
EJB),将注射合适的EntityManager地方@PersistenceContext放置。

如果您对在某些情况下Bean是某种单例(一个无状态Bean /一个作用域单例的spring
bean)的普通情况下如何实现这一点感兴趣,那么容器实际上会在目标对象中注入一个代理。并且每次查询代理时,它都会获取 当前
EntityManager实例,该实例(至少在spring的情况下)绑定到ThreadLocal(在这种情况下为request)

更新: 如果要在本地框架中实现此功能,请使用cglib / javassist /
JDK代理并将其注入到@PersistenceContext放置位置。一个请求=线程。在每个需要数据访问的请求上,创建一个新请求EntityManager并将其存储在中ThreadLocal。记住最后要清理它,因为servlet容器会重用线程。从代理可以获取当前ThreadLocal值。

但是,如果您不熟悉该项目,那么我建议您改用更稳定的东西,例如spring,cdi或guice。

2020-06-20