【发布时间】:2014-07-06 08:41:27
【问题描述】:
在 Java SE 环境中运行的桌面应用程序中(无 DI,没有除 JPA 之外的框架,纯 Java),最好为持久层中的每个操作创建一个新的 EntityManager 或共享 EntityManager 的单个实例在整个持久层中?
两种解决方案的优缺点?
更新:
应用程序使用一个只有一个架构的数据库实例。
【问题讨论】:
标签: java jpa desktop-application entitymanager
在 Java SE 环境中运行的桌面应用程序中(无 DI,没有除 JPA 之外的框架,纯 Java),最好为持久层中的每个操作创建一个新的 EntityManager 或共享 EntityManager 的单个实例在整个持久层中?
两种解决方案的优缺点?
更新:
应用程序使用一个只有一个架构的数据库实例。
【问题讨论】:
标签: java jpa desktop-application entitymanager
每次手术都有一个 EM 至少有三个充分的理由。
如果任何其他进程修改了数据库(或者即使同一进程使用 JDBC 或批处理查询来修改数据库),EM 的缓存中也会有陈旧的数据。如果您的 EM 仅在交易期间存在,那么您几乎没有必须处理陈旧数据的风险。
如果 EM 发生任何异常,则其状态不再可靠,必须关闭 EM。
如果多个线程访问 EntityManager,则每个线程需要一个 EM,因为 EM 不是线程安全的。
这是第四个:即使假设一切正常,只有一个线程访问数据库,EM 的缓存将增长并消耗内存。由于忘记初始化关联的反面,您还可能在缓存中存在不一致的对象图。每笔交易有一个 EM 没有这个问题。
【讨论】:
EntityManager 是 JPA 世界的入口点。它提供 API 来访问 JPA 会话并管理模式。它还拥有缓存。
因此,恕我直言,没有理由每次操作都持有EntityManager。有理由为每个 DB 模式保留 EntityManager。例如,如果您的应用程序使用 2 个完全不同且没有任何共享表的数据库模式,则您可以为每个模式使用 EntityManager。
【讨论】: