Hallo,
ich bin neu im Forum und hoffe, dass ihr mir vielleicht helfen könnt. Seit einer Woche versuche ich, ein Programm zu optimieren und finde keinen Weg, dass es sein Tempo behält und nicht immer langsamer wird.
Kurz zum Programm. Ich möchte ein Programm schreiben, welches Daten von einer ODBC-Datenbank in eine andere transferiert. Im Konkreten Fall von einer ADS-Datenbank in eine MySQL-Datenbank.
Der Programmabschnitt, welcher immer langsamer wird ist derjenige, der aus dem Resultset der Abfrage den Insert-Query erzeugt.
Zuerst habe ich es mit einer Stringverkettung versucht, anschließend mit Vectoren, jetzt zum Schluss mit einem Stringbuilder, auf den mich Google gebracht hat. Aller x-hundert Einträge leere ich die Variablen und führe das Insert-Query auf, in der Hoffnung, dass der Garbage-Collector Aufräumt und die Geschwindigkeit wieder gegeben ist.
Für die ersten 800 Datensätze erstellt er recht flott das Insert-Query, anschließend wird er immer langsamer, bis er schließlich im Sekundentakt die Datensätze verarbeitet = unererträglich und nicht praxistauglich. Anbei der Quelltext - ich habe versucht, ihn gut zu kommentieren und übersichtlich zu gestalten:
Ich verstehe nicht, warum er langsamer wird?
Könnt ihr mir helfen, warum er langsamer wird und was ich dagegen tun kann?
Danke und viele Grüße,
Matthias
ich bin neu im Forum und hoffe, dass ihr mir vielleicht helfen könnt. Seit einer Woche versuche ich, ein Programm zu optimieren und finde keinen Weg, dass es sein Tempo behält und nicht immer langsamer wird.
Kurz zum Programm. Ich möchte ein Programm schreiben, welches Daten von einer ODBC-Datenbank in eine andere transferiert. Im Konkreten Fall von einer ADS-Datenbank in eine MySQL-Datenbank.
Der Programmabschnitt, welcher immer langsamer wird ist derjenige, der aus dem Resultset der Abfrage den Insert-Query erzeugt.
Zuerst habe ich es mit einer Stringverkettung versucht, anschließend mit Vectoren, jetzt zum Schluss mit einem Stringbuilder, auf den mich Google gebracht hat. Aller x-hundert Einträge leere ich die Variablen und führe das Insert-Query auf, in der Hoffnung, dass der Garbage-Collector Aufräumt und die Geschwindigkeit wieder gegeben ist.
Für die ersten 800 Datensätze erstellt er recht flott das Insert-Query, anschließend wird er immer langsamer, bis er schließlich im Sekundentakt die Datensätze verarbeitet = unererträglich und nicht praxistauglich. Anbei der Quelltext - ich habe versucht, ihn gut zu kommentieren und übersichtlich zu gestalten:
Code:
private void generateInsertQueryFromResultSet(ResultSet resultSet, TableColumn[] tableColumns, String tableName) throws SQLException { StringBuilder stringBuilder = new StringBuilder(); // Insert-Header hinzufügen ( Also das INSERT INTO TABELLE // (Spalte1,Spalte2,...) VALUES ) stringBuilder.append(getInsertQueryHeader(tableColumns, tableName)); int j = 0; // Gehe durch alle einzelnen Datensätze while (resultSet.next()) { /* * Alle 200 Datensätze nimm das Insert-Query und führe es aus. * Anschließend leere den Stringbuffer und fülle ihn erneut iterativ */ if ((j % 200 == 0) && (j > 0)) { System.out.println("Datensatz " + j + " von Tabelle " + tableName); // Insert-Query ausführen doInsertQueryToNewTable(stringBuilder.toString()); // Reinitialisieren der Variable um Speicherplatz frei zu // schaufeln (leider ohne Erfolg) stringBuilder = new StringBuilder(); // Wieder Insert-Header hinzufügen ( Also das INSERT INTO // TABELLE (Spalte1,Spalte2,...) VALUES ) stringBuilder.append(getInsertQueryHeader(tableColumns, tableName)); } else if (j > 0) {// Wenn nicht erster Datensatz, füge Komma für vorherige Zeile ein stringBuilder.append(",\r\n"); } /* * Beginn neuer Datensatz Value-Abschnitt des Querys (Values * (Value1, Value2,...) ) */ // KLammer auf stringBuilder.append("( "); for (int i = 0; i < tableColumns.length; i++) { // Wert des Feldes / die Funktion enthält eine Switch-Klausel, // welche Datentypgerecht in einen String umwandelt) stringBuilder.append(getInsertValueString(tableColumns[i], resultSet)); // Ich habe mal versucht, die Funktion durch einen pauschalen // String zu ersetzen: Kein Geschwindigkeitsgewinn // stringBuilder.append("WERT"); if ((i + 1) != tableColumns.length) { // Zwischen den Werten ein Komma einfügen stringBuilder.append(", "); } }// ENDE FOR // Ende Zeile / Value-Eintrag --> Klammer Zu und Zeilenumbruch stringBuilder.append(")\r\n"); j++; }// ENDE WHILE }
Könnt ihr mir helfen, warum er langsamer wird und was ich dagegen tun kann?
Danke und viele Grüße,
Matthias
Comment