我应该多久创建一次 EntityManager?
Posted
技术标签:
【中文标题】我应该多久创建一次 EntityManager?【英文标题】:How frequently should I create an EntityManager? 【发布时间】:2011-05-12 15:46:02 【问题描述】:我有一个EntityManagerFactory
,我可以为其创建一个(或多个)EntityManager
实例。我正在使用 Servlet 环境,并且我有一个 EntityManagerFactory 连接到 servlet(通过 servlet 上下文),它在 servlet 的生命周期内共享(因此,对于所有用户)。
我可以执行以下操作之一:
为我的 servlet 的生命周期创建一个 EntityManager(例如,在所有用户之间共享) 为每个用户创建一个(这样每个用户在 HttpSession 中都有自己的) 为每个 HTTP 请求创建一个(例如,通过实例化一个新请求并在doGet
方法结束时将其关闭)
哪个最合适?创建 EntityManager 的成本高吗? 如果我执行单个共享 EntityManager,是否有单个事务范围(即独立用户之间的更新可以提交其他更改)?
【问题讨论】:
【参考方案1】:一个 EM 用于整个 servlet 听起来不太好。如果您不使用容器管理的 EM(例如 EJB3),那么建议将 EM 用于 particular unit of work。
在 Web 应用程序上下文中,您的第三个建议(每个 HTTP 请求一个)听起来不错。但是,这可能会导致您陷入将服务层与数据库层捆绑在一起的陷阱(您的服务层甚至不应该知道 EM 的存在)。
另一种方法是以编程方式在您的 DAO 中标记事务,并让您的 DAO 为每个方法调用使用一个新的 EM。
编辑:与具有显着开销的 EMF 相比,EM 的创建成本低。使用一个 EMF(您似乎这样做)和大量 EM 是可行的方法。
【讨论】:
同意。我完全建议您使用像 EJB 3 或 Spring 框架这样的集成框架,这将减轻 EntityManager 管理的负担。【参考方案2】:我们为每个slsb 做一个注入实体管理器, - 并且 slsb 本身是通过一个委托访问的,每个会话有一个委托,它查找本地/远程接口。使用ejb3.0。
【讨论】:
每个会话如何有一个无状态bean?根据定义,无状态 bean 不绑定到会话。 @Philipp Jardas 已编辑。无状态 bean 被定义为不存储可序列化的会话状态/数据。因此,为每个会话创建一个 slsb 实例是完全有效的。据我了解,它们的开销比 SFSB 少得多。 “有效为每个会话创建一个 slsb 实例”。从什么时候开始,我们获得了允许我们创建无状态 EJB 实例的工厂方法?我认为您的意思是应用程序控制生命周期的有状态 EJB:s(每次查找都会产生一个新的 bean,并且应用程序必须调用 @Remove 方法或让 bean 超时)或通过 CDI 隐式控制生命周期(例如使用@SessionScoped)。【参考方案3】:是的,我同意 NimChimpsky 和 Qwerky 在访问 DB 时使用 EJB3.x 并且每个工作单元使用一个 EM。
【讨论】:
以上是关于我应该多久创建一次 EntityManager?的主要内容,如果未能解决你的问题,请参考以下文章