Mysql
 sql >> Database >  >> RDS >> Mysql

La fusione/persistenza di OpenJPA è molto lenta

Puoi provare ad avviare la transazione prima dell'iterazione e quindi a eseguirne il commit in seguito all'interno di una singola transazione. Quindi, in pratica stai creando un batch che verrebbe unito/persistito durante il commit.

Inoltre, puoi limitare il numero di oggetti in un batch da elaborare alla volta e svuotare esplicitamente le modifiche nel database.

Qui, stai avviando una transazione e commettendola in ogni iterazione e anche creando/chiudendo l'entità manager ogni volta, influirà sulle prestazioni di numerosi dati.

Sarà qualcosa come sotto il codice.

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();

Qui puoi anche eseguire il rollback dell'intera transazione se uno qualsiasi degli oggetti non riesce a persistere/unire.