Du kan prøve at starte transaktionen før iteration og derefter begå den bagefter inden for en enkelt transaktion. Så grundlæggende opretter du en batch, som ville blive flettet/vedvarende ved commit.
Du kan også begrænse antallet af objekter i en batch, der skal behandles ad gangen, og du kan eksplicit tømme ændringerne i databasen.
Her initierer du en transaktion og forpligter den i hver iteration, og også at oprette/lukke enhedsadministrator hver gang, vil påvirke ydeevnen for adskillige data.
Det vil være noget i stil med koden nedenfor.
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();
Her kan du også rulle hele transaktionen tilbage, hvis noget af objektet ikke fortsætter/flettes.