U kunt proberen de transactie vóór iteratie te starten en deze daarna binnen een enkele transactie vast te leggen. Dus eigenlijk creëer je een batch die zou worden samengevoegd/aangehouden bij commit.
U kunt ook het aantal objecten in een batch dat tegelijk moet worden verwerkt, beperken en de wijzigingen expliciet in de database doorspoelen.
Hier initieert u een transactie en voert u deze in elke iteratie uit en ook elke keer dat u entiteitsmanager maakt/sluit, heeft dit invloed op de prestaties voor tal van gegevens.
Het zal zoiets zijn als onderstaande code.
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();
Hier kunt u ook de hele transactie terugdraaien als een van de objecten niet blijft bestaan/samenvoegt.