gpt4 book ai didi

jpa - 什么时候刷新和清除提交?

转载 作者:行者123 更新时间:2023-12-01 11:22:11 25 4
gpt4 key购买 nike

我正在使用 JPA EclipseLink 2.0 和 Glassfish 3.1.2.2

我想知道我打电话后是否

em.flush() 
em.clear()

对象立即提交到数据库。我的问题是我做的交易太多了,我得到了 OutOfMemory .我想通过刷新事务的对象来避免这种情况。

在我刷新和清除之后,我看不到任何直接提交到数据库的实体,我只能在整个过程完成后看到它们,这告诉我这实际上并没有提交。

如果 flush 和 clear 没有提交:

1)它实际上做了什么?

2) 为什么我不再获得 OutOfMemory?

请告诉我我是否正确:

在我的 RAM 中分配的对象被发送到数据库,但尚未提交更改。这仅意味着我清除了 RAM,对象现在位于数据库服务器中,但尚未提交事务。

最佳答案

实体同步到连接的数据库 交易 提交 时间。如果您只有 n = 1 个正在进行的事务(这里:JTA/容器管理),一个或多个实体的更改会在您调用 flush() 的那一刻写入数据库在 EntityManager实例。

但是,只有在负责事务处理的容器(此处为 Glassfish)正确执行事务后,更改才会“可见”。供引用,请参阅。 JPA Spec 2.0 的第 7.6.1 节(第 294 页)它定义了:

A new persistence context begins when the container-managed entity manager is invoked (Specifically, when one of the methods of the EntityManager interface is invoked) in the scope of an active JTA transaction, and there is no current persistence context already associated with the JTA transaction. The persistence context is created and then associated with the JTA transaction.

The persistence context ends when the associated JTA transaction commits or rolls back, and all entities that were managed by the EntityManager become detached.



JPA Spec 2.0 的第 3.2.4 节(与数据库同步)中我们发现:

The state of persistent entities is synchronized to the database at transaction commit.

[..]

The persistence provider runtime is permitted to perform synchronization to the database at other times as well when a transaction is active. The flush method can be used by the application to force synchronization.

It applies to entities associated with the persistence context. The EntityManager and Query setFlushMode methods can be used to control synchronization semantics. The effect of FlushModeType.AUTO is defined in section 3.8.7. If FlushModeType.COMMIT is specified, flushing will occur at transaction commit; the persistence provider is permitted, but not required, to perform to flush at other times. If there is no transaction active, the persistence provider must not flush to the database.



最有可能在您的场景中,容器(Glassfish)和/或您的应用程序配置为 FlushModeType.COMMIT (*1)。万一 FlushModeType.AUTO就位,由持久性提供程序 (EclipseLink) 负责“负责确保对持久性上下文中所有实体的状态的所有更新,这些更新可能会影响查询的结果,对查询的处理是可见的。” (第 3.8.7 节,第 122 页)

相比之下, clear()方法本身不会提交任何东西。它只是将所有托管实体从当前持久性上下文中分离出来,从而导致对尚未刷新(提交)的实体的任何更改丢失。如需引用,请参见第 3 页。 70个链接 JPA Spec .

关于 OutOfMemoryError ,很难说是什么原因导致了这种情况,因为您也没有提供太多细节。但是,我会:
  • 阅读 JPA 规范
  • 的上述部分
  • 检查您的环境是如何配置的和
  • 重新评估您的应用程序是如何编写/实现的,可能会对正在运行的容器的事务处理做出错误的假设。

  • 与 2. 相关,您可以查看您的 persistence.xml是否配置
    <property name="eclipselink.persistence-context.flush-mode" value="COMMIT" />

    并将其更改为 AUTO看看有没有区别。

    希望能帮助到你。

    脚注

    *1:但这是一个很好的猜测,因为您没有提供关于您的设置/环境的太多细节。

    关于jpa - 什么时候刷新和清除提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40877675/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com