sql >> Base de Datos >  >> RDS >> Mysql

La fusión/persistencia de OpenJPA es muy lenta

Puede intentar iniciar la transacción antes de la iteración y luego confirmarla en una sola transacción. Entonces, básicamente, está creando un lote que se fusionaría/persistiría en la confirmación.

Además, puede limitar la cantidad de objetos en un lote que se procesarán a la vez y puede vaciar explícitamente los cambios en la base de datos.

Aquí, está iniciando una transacción y comprometiéndola en cada iteración y también creando/cerrando el administrador de la entidad cada vez, afectará el rendimiento de numerosos datos.

Será algo como el siguiente código.

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

Aquí, también puede revertir toda la transacción si alguno de los objetos no persiste/fusiona.