sql >> Databasteknik >  >> RDS >> Mysql

OpenJPA sammanslagning/beständig är mycket långsam

Du kan prova att starta transaktionen före iteration och sedan utföra den efteråt inom en enda transaktion. Så, i princip skapar du en batch som skulle slås samman/bevaras vid commit.

Du kan också begränsa antalet objekt i en batch som ska bearbetas åt gången och kan explicit spola ändringarna i databasen.

Här initierar du en transaktion och genomför den i varje iteration och även att skapa/stänga entity manager varje gång, kommer att påverka prestanda för många data.

Det kommer att vara något i stil med koden nedan.

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

Här kan du också återställa hela transaktionen om något av objekten inte kvarstår/sammanfogar.




  1. Hur MAKE_SET() fungerar i MariaDB

  2. MySQL ATAN2() Funktion – Returnera bågtangenten av 2 värden

  3. Är en vy snabbare än en enkel fråga?

  4. Konvertera hex till binär i MySQL