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

标签 java jpa eclipselink

我需要迭代 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/

相关文章:

Javax 持久性在生产级别将 IDENTITY 更改为 SEQUENCE

spring - Quartz 与 Spring 未提交

java - 带有 Java 8 Streams 分离对象的 Spring Data JPA 存储库?

java - 表中的 JPA 实体将 int 主键转换为 String

java - org.postgresql.util.PSQLException : ERROR: syntax error at or near "("

java - 单击链接 Selenium 后如何驱动浏览器窗口的新实例

java - 如何在 GXT 3.x 中实现卡住列?

java - 如何在 log4j 2 中添加/减去日期?

java - 带有 Map 的 JPA NullPointerException

mysql - 统计JPA中使用 "group by"和 "having"过滤的行数