【问题标题】:JPA desktop application single or multiple instances of EntityManagerJPA 桌面应用程序 EntityManager 的单个或多个实例
【发布时间】:2014-07-06 08:41:27
【问题描述】:

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

两种解决方案的优缺点?

更新:

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

【问题讨论】:

    标签: java jpa desktop-application entitymanager


    【解决方案1】:

    每次手术都有一个 EM 至少有三个充分的理由。

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

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

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

    这是第四个:即使假设一切正常,只有一个线程访问数据库,EM 的缓存将增长并消耗内存。由于忘记初始化关联的反面,您还可能在缓存中存在不一致的对象图。每笔交易有一个 EM 没有这个问题。

    【讨论】:

      【解决方案2】:

      EntityManager 是 JPA 世界的入口点。它提供 API 来访问 JPA 会话并管理模式。它还拥有缓存。

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

      【讨论】:

      • EntityManager 不管理架构。 EntityManagerFactory 就是这样做的。并且每个操作都有一个 EM 至少有三个充分的理由:如果任何其他进程修改了数据库(或者即使同一进程使用 JDBC 或批处理查询来修改数据库),EM 的缓存中也会有陈旧的数据。如果 EM 发生任何异常,则其状态不再可靠。如果多个线程访问 EntityManager,则每个线程需要一个 EM,因为 EM 不是线程安全的。
      • 好点,@JB Nizet。您为什么不发表评论作为替代答案?
      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 2020-07-09
      • 2013-01-02
      • 2012-12-02
      • 1970-01-01
      • 2011-10-19
      • 2019-05-20
      • 1970-01-01
      相关资源
      最近更新 更多