Vous pouvez essayer de démarrer la transaction avant l'itération et de la valider ensuite dans une seule transaction. Donc, en gros, vous créez un lot qui serait fusionné/persistant lors de la validation.
En outre, vous pouvez limiter le nombre d'objets dans un lot à traiter à la fois et pouvez explicitement vider les modifications dans la base de données.
Ici, vous initiez une transaction et la validez à chaque itération, ainsi que la création/fermeture du gestionnaire d'entités à chaque fois, cela affectera les performances de nombreuses données.
Ce sera quelque chose comme le code ci-dessous.
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();
Ici, vous pouvez également annuler l'intégralité de la transaction si l'un des objets ne parvient pas à persister/fusionner.