gpt4 book ai didi

java - 使用 JPA/EclipseLink 修改大量对象

转载 作者:太空宇宙 更新时间:2023-11-04 14:12:13 25 4
gpt4 key购买 nike

我需要迭代 50k 个对象并更改其中的一些字段。
我的内存有限,所以我不想一次将所有 50k 对象放入内存。
我想使用游标使用以下代码来完成此操作,但我想知道使用游标处理的所有对象是否都保留在实体管理器缓存中。
我不想使用偏移量和限制来执行此操作的原因是因为数据库需要更加努力地工作,因为每个页面都是一个完整的新查询。
根据以前的经验,一旦实体管理器缓存变大,更新就会变得非常慢。
因此,通常我会在每隔数百次更新后调用“flush”和“clear”。
这里的问题是刷新/清除会破坏光标。
我很乐意学习更新大量对象而不将它们全部加载到内存中的最佳方法。
有关 EclipseLink 光标在这种情况下如何工作的其他信息也很有值(value)。

JpaQuery<T> jQuery = (JpaQuery<T>) query;
jQuery.setHint(QueryHints.RESULT_SET_TYPE, ResultSetType.ForwardOnly)
.setHint(QueryHints.SCROLLABLE_CURSOR, true);
Cursor cursor = jQuery.getResultCursor();
Iterator<MyObj> cursorIterator = cursor.iterator();
while (cursorIterator.hasNext()) {
MyObj myObj = cursorIterator.next();
ChangeMyObj(myObj);
}
cursor.close();

最佳答案

使用pagination + 每页之后的 entityManager.clear()。还可以在单​​个事务中执行每个页面,或者在发生异常后您必须创建/获取一个新的 EntityManager(至少对于 Hibernate:EntityManager 实例在异常后可能处于不一致的状态)。

关于java - 使用 JPA/EclipseLink 修改大量对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28193153/

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