【发布时间】:2021-05-06 10:18:54
【问题描述】:
我有一段长时间运行的 JPA+Hibernate 代码,它试图循环插入大量记录到数据库中。
随着时间的推移(可能是因为 EntityManager 缓存建立/脏检查),处理速度变得越来越慢。为了解决这个问题,我决定在每次迭代结束时使用em.flush() 和em.detach(entity),因为一旦实体被持久化,我就不需要它的数据进行进一步处理(不幸的是我不能使用em.clear() 或批处理,为了减少我的更改的外部影响)。
这是我的代码的粗略草稿:
for (...) {
...some selects here...
...create new entity object...
em.persist(entity);
em.flush();
em.detach(entity);
}
使用此序列,对于在上一次迭代中分离的实体,我得到“分离的实体传递给持久”错误。 为什么分离前的flush() 不能防止错误?另外,如果我将detach() 替换为clear(),一切正常。 我的印象是 clear() 和 detach() 的行为方式相同?
更奇怪的是,我可以使用以下代码在单次迭代中重现错误。 second 刷新会引发“分离实体...”错误。 这是否意味着第一次刷新是空操作?
em.flush();
em.detach(entity);
em.flush();
【问题讨论】: