Můžete zkusit zahájit transakci před iterací a poté ji potvrdit v rámci jedné transakce. Takže v podstatě vytváříte dávku, která by byla sloučena/přetrvávala při odevzdání.
Můžete také omezit počet objektů v dávce, které mají být zpracovány najednou, a můžete explicitně uložit změny do databáze.
Zde zahajujete transakci a provádíte ji v každé iteraci a také pokaždé, když vytvoříte/zavřete správce entity, ovlivní výkon mnoha dat.
Bude to něco jako kód níže.
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();
Zde můžete také vrátit zpět celou transakci, pokud některý z objektů selže při zachování/sloučení.