Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

A mesclagem/persistência do OpenJPA é muito lenta


Você pode tentar iniciar a transação antes da iteração e depois confirmá-la em uma única transação. Então, basicamente você está criando um lote que seria mesclado/persistente no commit.

Além disso, você pode limitar o número de objetos em um lote a serem processados ​​por vez e pode liberar explicitamente as alterações no banco de dados.

Aqui, você está iniciando uma transação e confirmando-a em cada iteração e também criando/fechando o gerenciador de entidade a cada vez, afetará o desempenho de vários dados.

Será algo como o código abaixo.
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();

Aqui, você também pode reverter toda a transação se algum objeto falhar em persistir/mesclar.