2016-07-26 10 views
1

Ich versuche, große Menge von Zeilen in verschiedenen Tabellen in der Datenbank von Java-Anwendung einfügen. Im Grunde genommen habe ich eine einzige Verbindung, mit der ich mehrere Prepare-Anweisungen erstelle. Dann bereite ich mehrere Inserts vor, indem ich die Variablen von prepare-Anweisungen setze. Schließlich führe ich jede Prepare-Anweisung als Batch ausführen aus und schließe die Anweisung.Charge der vorbereiteten Anweisung in Java Sql lange dauern während der letzten Iteration

Problem, mit dem ich konfrontiert bin, ist, dass ich eine Iteration über den oben genannten Prozess mache.

Ich habe eine Methode WriteToDataBase(), die die oben genannten Operationen ausführt, und diese Methode wird innerhalb einer Schleife aufgerufen. die Batch-Insertionen geschehen also oft (jede Charge besteht aus 20 Objekten). Jedes Mal, wenn diese Einfügung ca. 5 bis 6 Sekunden dauert, wird in einer Iteration eine Batch-Insertion durchgeführt. aber in der letzten Iteration dauert es sehr lange ungefähr 40 Sekunden.

ich dachte, dies wäre aufgrund der Daten in der letzten Iteration geschrieben werden. Also änderte ich auch die Daten, um es leicht zu machen, aber selbst dann blieb das Problem bestehen. Dann habe ich versucht, das automatische Commit zu deaktivieren und es manuell zu committen. Das hat auch nicht geholfen.

ich änderte auch die Anzahl der Iterationen. zum Beispiel

In einer Schleife von 20 Zählern würde die 20. Schleife eine Menge Zeit benötigen. also änderte ich es für 5 mal. aber diesmal lief die 5. Schleife länger. Grundsätzlich benötigt die letzte Schleife eine lange Zeit, um den Batch auszuführen.

um zu überprüfen, gibt es kein Speicherleck, ich schließe auch die Anweisungen sind seine Ausführung. Aber ich verstehe nicht, warum das passiert.

Code-Snippet wird unten zur Verfügung gestellt.

for(ArrayList<DocumentObject> batch : documentBatches){ 
    DBWriter.writeToDataBase(batch); 
} 

public static synchronized boolean writeToDataBase(ArrayList<DocumentObject> batch)  { 
     try { 
    //Prepare Statements for insertion 
     String insertDocumentTableSQL = "INSERT INTO TEST.DOCUMENTS values (?,?,?,?,?,?,?,?);"; 
     PreparedStatement documentPreparedStatement = connection.prepareStatement(insertDocumentTableSQL); 
     String insertSentencesTableSQL = "INSERT INTO TEST.SENTENCES values (?,?,?,?,?,?);"; 
     PreparedStatement sentencesPreparedStatement = connection.prepareStatement(insertSentencesTableSQL); 
    //Preparing multiple inserts to the prepare statements 
    for(DocumentObject docObj : batch){ 
    documentPreparedStatement = prepareInsertsToDocumentsTable(docObj,documentPreparedStatement);   //sets the '?' in the query with actual values and adds it to the batch 
    sentencesPreparedStatement = prepareInsertsToSentencesTable(headlineSRLDocument, sectionId,sentencesPreparedStatement); 
     } 
    //execute the preparestatements 
     connection.setAutoCommit(false); 
    long start = System.currentTimeMillis(); 
     documentPreparedStatement.executeBatch(); 
     sentencesPreparedStatement.executeBatch(); 
     connection.commit(); 
     documentPreparedStatement.close(); 
     sentencesPreparedStatement.close(); 
    System.out.println("time taken for Execute Statements: "+(System.currentTimeMillis()-start)/1000+" seconds"); 
    return true; 
    } 

Unten ist die Konsolenausgabe, die ich hatte, um die für jede Iteration benötigte Zeit zu verfolgen.

Zeit für Execute Statements wird: 3 Sekunden

Zeit, die für Anweisungen ausführen: 4 Sekunden

Zeit für Anweisungen ausführen genommen: 4 Sekunden

Zeit, die für Anweisungen ausführen: 4 Sekunden

Zeit für Ausführungsanweisungen: 5 Sekunden

Zeit für Execute Statements genommen: 5 Sekunden

Zeit, die für Anweisungen ausführen: 9 Sekunden

Zeit für Execute Statements genommen: 10 Sekunden

Zeit, die für Anweisungen ausführen: 6 Sekunden

Zeit für Ausführungsanweisungen: 47 Sekunden < ------ letzte Iteration nimmt mehr Zeit

+0

Versuchen Sie, diese Timing-Anweisungen bei jedem Aufruf hinzuzufügen, um festzustellen, welche Funktion mehr Zeit benötigt? BTW welche Datenbank ist das? –

+0

ist zu dieser Zeit eine Garbage Collection-Aktivität? –

+0

Hallo Sameer, ich benutze SAP HANA-Datenbank. und ich habe festgestellt, dass .executeBatch() -Anweisungen mehr Zeit brauchen. aber in anderen Iterationen verbraucht es nicht so viel Zeit. Ich bin mir nicht sicher über die Speicherbereinigung Aktivität. –

Antwort

1

Ich habe die Antwort gefunden.Dies geschah im Wesentlichen, da die letzte Schleife im Vergleich zu anderen Schleifen mehr Anweisungen vorbereitete und sie dem Stapel hinzufügte.

Ich überprüfte dies, indem ich einen konsistenten Datensatz hatte, in dem ich die Anzahl der Anweisungen kannte, die für jede Schleife vorbereitet und zum Batch hinzugefügt würden. Vorher wurden die Anweisungen generiert und dynamisch hinzugefügt und somit hatte ich keine Ahnung, wie viele Anweisungen in einer Schleife ausgeführt werden. Daher gibt es kein Problem mit der preparedStatement.executeBatch() oder der Datenbank, wie ich vermutet hatte.

Vielen Dank für Ihre Hilfe.

Verwandte Themen