Du kan prova att starta transaktionen före iteration och sedan utföra den efteråt inom en enda transaktion. Så, i princip skapar du en batch som skulle slås samman/bevaras vid commit.
Du kan också begränsa antalet objekt i en batch som ska bearbetas åt gången och kan explicit spola ändringarna i databasen.
Här initierar du en transaktion och genomför den i varje iteration och även att skapa/stänga entity manager varje gång, kommer att påverka prestanda för många data.
Det kommer att vara något i stil med koden nedan.
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();
Här kan du också återställa hela transaktionen om något av objekten inte kvarstår/sammanfogar.