JPA 桌面应用程序单个或多个 EntityManager 实例

Fed*_*dy2 5 java jpa desktop-application entitymanager

在 Java SE 环境中运行的桌面应用程序(没有 DI,除了 JPA 之外没有框架,纯 Java)最好为持久层中的每个操作创建一个新的 EntityManager 或者在整个过程中共享 EntityManager 的单个实例持久层?

两种解决方案的利弊?

更新:

该应用程序使用一个只有一个架构的数据库实例。

JB *_*zet 5

每次操作使用一个 EM 至少有三个充分的理由。

如果任何其他进程修改数据库(或者即使同一进程使用 JDBC 或批量查询来修改数据库),EM 的缓存中也会有过时的数据。如果您的 EM 仅在交易期间存在,那么您几乎没有处理过时数据的风险。

如果 EM 发生任何异常,则其状态不再可靠,并且必须关闭 EM。

如果多个线程访问 EntityManager,则每个线程需要一个 EM,因为 EM 不是线程安全的。

这是第四个:即使假设一切顺利,只有一个线程访问数据库,EM 的缓存也会不断增长并消耗内存。由于您忘记初始化关联的反面,因此您还可能面临缓存中对象图不一致的风险。每笔交易使用一个 EM 就不存在这个问题。


Ale*_*exR 1

EntityManager是 JPA 世界的入口点。它提供 API 来访问 JPA 会话并管理架构。它还保存缓存。

因此,恕我直言,没有理由保留EntityManager每次操作。可能有理由保留 EntityManager每个数据库模式。例如,如果您的应用程序使用 2 个完全不同的数据库模式,并且没有任何共享表,您可以使用EntityManager每个模式。

  • EntityManager 不管理架构。EntityManagerFactory 就是这样做的。每个操作至少有一个 EM 的三个充分理由:如果任何其他进程修改数据库(或者即使同一进程使用 JDBC 或批量查询来修改数据库),EM 的缓存中也会有过时的数据。如果 EM 发生任何异常,则其状态不再可靠。如果多个线程访问 EntityManager,则每个线程需要一个 EM,因为 EM 不是线程安全的。 (3认同)