gpt4 book ai didi

jpa - 始终打开 EntityManager

转载 作者:行者123 更新时间:2023-12-04 04:51:12 26 4
gpt4 key购买 nike

我找到了这个问题,Keeping JPA EntityManager open? ,但我还是有些担心。

在应用程序生命周期中始终打开 EnityManager 是个好主意吗?它是否消耗了一些资源,如数据库连接?如果使用弱引用,它会保留实体还是会释放它们?我使用 EclipseLink 2.x。

谢谢

兹拉亚

最佳答案

EntityManager 被设计为相当短命的。技术上可以长时间保持打开状态,但迟早你会面临以下问题:

  • 如您所写 EnityManager 保持加载的实体 并且确实它使它们保持使用弱引用(至少对于 Hibernate,但我不确定 JPA 规范是否要求这样做)。所以他们应该在JVM耗尽内存之前被释放。不幸的是,我已经看到保留大量实体会影响 EM 性能 很多 (当然是负面的)当数字增长时。
  • 开放 EM 可能 使用数据库连接 ,例如。当内存中有可延迟加载的对象时。
  • EM 定义 不是线程安全的 ,因此在 Web 应用程序中(例如)重用/共享一个实例是完全 Not Acceptable 。
  • 可能最大的问题是当有任何错误 发生在 EM 中(例如,由于违反 DB 约束而提交事务), JPA 要求尽快关闭 EM 并丢弃。这会将您驻留在内存中的所有实体置于分离状态,这意味着触摸任何延迟加载的集合/引用都将失败。一种解决方法是重新加载所有实体,但是当它们分散在整个应用程序层时,在更大的应用程序中很难。一个解决方案是开始使用分离的实体并使用 EntityManager.merge() .但这通常需要更改编程模型,尤其是与“始终开放”实体管理器方法有些矛盾。您应该只使用一种方法并坚持下去。

  • 所以一般最好保留 EntityManager短暂的,它确实简化了很多事情。

    关于jpa - 始终打开 EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17424296/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com