Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Das Zusammenführen/Bestehen von OpenJPA ist sehr langsam

Sie können versuchen, die Transaktion vor der Iteration zu starten und sie anschließend innerhalb einer einzigen Transaktion festzuschreiben. Im Grunde erstellen Sie also einen Stapel, der beim Commit zusammengeführt/persistent wird.

Außerdem können Sie die Anzahl der gleichzeitig zu verarbeitenden Objekte in einem Stapel begrenzen und die Änderungen explizit in die Datenbank schreiben.

Hier initiieren Sie eine Transaktion und führen sie in jeder Iteration durch und auch das Erstellen/Schließen von Entitätsmanagern jedes Mal wird die Leistung für zahlreiche Daten beeinträchtigen.

Es wird so etwas wie der folgende Code sein.

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

Hier können Sie auch die gesamte Transaktion rückgängig machen, wenn eines der Objekte nicht bestehen bleibt/zusammengeführt wird.