【问题标题】:Two EAR files, same JPA entitymanager, same transaction => same session?两个 EAR 文件,相同的 JPA 实体管理器,相同的事务 => 相同的会话?
【发布时间】:2011-05-25 18:43:54
【问题描述】:

假设我有两个应用程序,每个应用程序都有一个单独的 EAR 文件,它们在同一个 JTA 事务中相互调用。如果两者共享同一个实体管理器,它们会获得相同的会话还是每次都创建新的会话?

【问题讨论】:

  • 应用程序是否共享类文件?
  • 是的,实体和一些常用的api
  • 您是否已将 entitymanager 配置为使用扩展的持久性上下文?

标签: java jpa transactions distributed jpa-2.0


【解决方案1】:

EntityManager(在 JPA 中)或多或少等同于 Session(在 Hibernate 中)。在纯 JPA 应用程序中,您只会使用 EntityManager。它封装了一个Session。 Session 与 EntityManager 一样长。

没有理由(我认为没有办法)在两个应用程序之间共享 EntityManager,因为它们在不同的 JVM 中运行(至少在我使用过的应用程序服务器上)。您可以做的是共享 EntityManager setup(称为 Persistence Unit)。您可以通过将实体类和 XML 放入 JAR 并在两个应用程序中使用它来做到这一点,但具体如何完成可能取决于您的应用程序服务器。它肯定与为第二个应用程序复制类和 XML 具有完全相同的效果。

将会发生这样的事情:两个应用程序中的每一个都有自己的持久性上下文。这意味着,当您在一个应用程序中加载实体时,它不会在另一个应用程序中加载。如果您在应用程序一中加载和修改实体,然后在应用程序二中加载它,应用程序二将看到未修改的实体(除非您有非常奇怪的事务隔离设置并且应用程序一决定刷新实体首先)。

任何冲突只会在 JTA 事务结束时出现。我不知道那时会发生什么,我认为这取决于您的数据库和事务设置。如果两个应用程序尝试对相同的数据执行不同的操作,事务可能会回滚。每个应用程序都有自己的数据库连接。它们通过 JTA 事务绑定在一起,因此可以确保两者都提交或都回滚。

【讨论】:

    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多