小编典典
您可以尝试在迭代之前启动事务,然后在单个事务中提交。因此,基本上,您正在创建一个将在提交时合并/持久化的批处理。
此外,您可以限制一次要处理的批次中的对象数量,也可以将更改显式刷新到数据库中。
在这里,您要启动一个事务并在每次迭代中提交它,并且每次都创建/关闭实体管理器,这将影响大量数据的性能。
这将类似于下面的代码。
em = factory.createEntityManager();
em.getTransaction().begin();
int i = 0;
for (Object ob : list) {
Long start = Calendar.getInstance().getTimeInMillis();
em.merge(ob);
Long end = Calendar.getInstance().getTimeInMillis();
Long diff = end - start;
LOGGER.info("Time: " + diff);
/*BATCH_SIZE is the number of entities
that will be persisted/merged at once */
if(i%BATCH_SIZE == 0){
em.flush();
em.clear();
}
i++;
}
em.getTransaction().commit();
em.close();
在这里,如果任何对象无法持久/合并,您还可以回滚整个事务。
2020-11-19