Mysql
 sql >> Base de données >  >> RDS >> Mysql

La fusion/persistance d'OpenJPA est très lente

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.