Możesz spróbować rozpocząć transakcję przed iteracją, a następnie ją zatwierdzić w ramach jednej transakcji. Więc w zasadzie tworzysz partię, która zostanie scalona/utrwalona po zatwierdzeniu.
Możesz także ograniczyć liczbę obiektów w partii, które mają być przetwarzane na raz i możesz jawnie opróżnić zmiany do bazy danych.
Tutaj inicjujesz transakcję i zatwierdzasz ją w każdej iteracji, a także tworzenie/zamykanie menedżera encji za każdym razem, co wpłynie na wydajność wielu danych.
Będzie to coś takiego jak poniższy kod.
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();
Tutaj możesz również wycofać całą transakcję, jeśli którykolwiek z obiektów nie zostanie utrwalony/scalony.