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
Versuchen Sie, diese Timing-Anweisungen bei jedem Aufruf hinzuzufügen, um festzustellen, welche Funktion mehr Zeit benötigt? BTW welche Datenbank ist das? –
ist zu dieser Zeit eine Garbage Collection-Aktivität? –
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. –