Можете да опитате да стартирате транзакцията преди итерацията и след това да я извършите след това в рамките на една транзакция. Така че по същество създавате партида, която ще бъде обединена/продължена при комит.
Освен това можете да ограничите броя на обектите в пакета, които трябва да се обработват наведнъж, и можете изрично да изтриете промените в базата данни.
Тук вие инициирате транзакция и я извършвате във всяка итерация, а също така създавате/затваряте мениджър на обекти всеки път, ще повлияе на производителността за множество данни.
Ще бъде нещо като кода по-долу.
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();
Тук можете също да връщате назад цялата транзакция, ако някой от обектите не успее да се запази/слее.