始终打开EntityManager

时间:2013-07-02 11:24:01

标签: jpa entitymanager

我已经提到了这个问题Keeping JPA EntityManager open?,但我仍有一些担忧。

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

由于

Zlaja

1 个答案:

答案 0 :(得分:2)

EntityManager的设计相当短暂。技术上可以长时间保持打开状态,但迟早会遇到以下问题:

  1. 正如你写的那样EnityManager 保持加载的实体并确实让它们使用弱引用(至少使用Hibernate,但我不确定JPA是否需要这样做)眼镜)。因此,在JVM内存不足之前应该释放它们。不幸的是,我已经看到,当数量增加时,保留大量实体会影响EM性能很多(当然是负面的)。

  2. Open EM可能使用数据库连接,例如。当内存中存在可加载惰性的对象时。

  3. EM根据定义不是线程安全的,因此在Web应用程序中(例如)重用/共享一个实例是完全不可接受的。

  4. 可能最大的问题是当EM中出现错误时(例如,由于违反DB约束而导致事务提交), JPA要求EM应该是尽快关闭并丢弃。这将使驻留在内存中的所有实体处于分离状态,这意味着触摸任何延迟加载的集合/引用将失败。解决方法是重新加载所有实体,但是当它们分散在整个应用程序层时,在较大的应用程序中很难实现。解决方案是开始使用分离的实体并使用EntityManager.merge()。但这通常需要改变编程模型,特别是与“始终开放”的实体管理器方法相矛盾。你应该只使用一种方法并坚持下去。

  5. 所以一般来说,最好让EntityManager保持短暂,这样可以简化很多事情。