【问题标题】:OpenJPA: detaching all entities on EntityManager.close()OpenJPA:分离 EntityManager.close() 上的所有实体
【发布时间】:2014-01-29 15:13:11
【问题描述】:

有一个 OpenJPA 1.2.3 应用程序在 WebSphere 7 上运行,由于某些原因,我们不能对那里的实体管理器使用依赖注入。因此,我们管理它们在事务提交/回滚后手动关闭它们。最近我发现调用EntityManager.close() 需要相当长的时间(大约10% 的整个操作涉及加载~500 个实体)。它所做的是分离在事务期间加载的所有实体。 所以实际上有2个问题:

  1. 为什么我们需要在实体管理器关闭时分离所有实体?是不是因为 JPA 必须检查所有实体是否脏?
  2. 由于在某些情况下实体被加载为只读访问 - 是否有可能以某种方式告诉 OpenJPA 这些实体不应该被更新并且不需要将它们标记为脏、更新到 DB 等?

按要求添加我的persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">
    <persistence-unit name="DocumentUnit" transaction-type="JTA">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <class>ru.mypackage.Document</class>
        <class>ru.mypackage.DocParam</class>
        <class>ru.mypackage.DocParamPK</class>
        <!-- Some more classes -->
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
        </properties>
    </persistence-unit>
</persistence>

【问题讨论】:

    标签: java jpa openjpa


    【解决方案1】:

    为什么我们需要在实体管理器关闭时分离所有实体?是不是因为 JPA 必须检查所有实体是否脏?

    行为是根据 JPA 规范定义的。有点短的故事是,当一个实体被管理时,它与一个给定的 EntityManager 相关联。如果/当您关闭该 EntityManager 时,您必须告诉每个托管实体它的 Manager 现在已关闭。这应该是一个相当轻量级的操作,但我在实践中发现并非总是如此。原因是 OpenJPA 插入了一个数据结构来跟踪不再跟踪的实体的脏污程度。这针对您可能将这些分离的实体之一合并回另一个持久性上下文 (EntityManager) 的情况进行了优化。

    由于在某些情况下实体被加载为只读访问 - 是否有可能以某种方式告诉 OpenJPA 这些实体不应该被更新并且不需要将它们标记为脏、更新到 DB 等?

    是和不是。有一个feature, LiteAutoDetach that was added in OpenJPA 2.0.0 将使分离过程的重量更轻。不利的一面是,在您可能希望将分离的实体之一合并回持久性上下文的情况下,您将放弃一些性能/功能。

    我建议您分析 EntityManager.close() 操作以查看大部分时间都花在了哪里。您可能正在使用导致此性能问题的其他一些 OpenJPA 功能。

    为了微笑,你能用你的 persistence.xml 文件的内容更新帖子吗?

    【讨论】:

    • 将我的 persistence.xml 添加到帖子中,但不认为它会有所帮助 - 它很简单。无论如何,我接受答案,因为它更像是一个理论问题......我已经分析过 EntityManager.close() 基本上这就是这个问题的原因)大部分时间都花在分离所有已知实体上(不记得了确切的方法名称虽然 ( )。无论如何,这是尽快迁移到 JPA 2.0 的另一个原因。
    猜你喜欢
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多