sql >> Databáze >  >> RDS >> Mysql

Slučování/přetrvávání OpenJPA je velmi pomalé

Můžete zkusit zahájit transakci před iterací a poté ji potvrdit v rámci jedné transakce. Takže v podstatě vytváříte dávku, která by byla sloučena/přetrvávala při odevzdání.

Můžete také omezit počet objektů v dávce, které mají být zpracovány najednou, a můžete explicitně uložit změny do databáze.

Zde zahajujete transakci a provádíte ji v každé iteraci a také pokaždé, když vytvoříte/zavřete správce entity, ovlivní výkon mnoha dat.

Bude to něco jako kód níže.

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

Zde můžete také vrátit zpět celou transakci, pokud některý z objektů selže při zachování/sloučení.




  1. Účinek nápovědy NOLOCK v příkazech SELECT

  2. Mysql dotaz k dynamickému převodu řádků na sloupce

  3. mySql:získá řádky, ve kterých má počet slov v buňce (řetězec oddělený čárkou) stejnou hodnotu jako odpovídající buňka

  4. Jak urychlit načítání dat do InnoDB (LOAD DATA INFILE)?