Bei der Verwendung von JDBC zur Verbindung zur MySQL -Datenbank für die Dateninsertion werden insbesondere große Datenstapel kontinuierlich eingefügt (100.000). Wie kann man die Effizienz verbessern?
In der JDBC -Programmierschnittstelle gibt es zwei Methoden der Erklärung, die besonders bemerkenswert sind:
Die Batch -Verarbeitung von Daten kann durch die Verwendung addBatch() und executeBatch() -Methoden erreicht werden.
Es ist jedoch erwähnenswert, dass Sie zuerst ein manuelles Komit in der Datenbankverbindung connection.setAutoCommit(false) einrichten und dann connection.commit() nach Ausführung der Anweisung ausführen müssen.
importieren java.io.bufufferedReader; import java.io.ioxception; import java.sql.drivermanager; import Java.sql.PrepararedStatement; import Java.sql.sqlException importieren Java.util. db_test (param1, param2, param3, param4, param5) Werte (?,?,?,?,?) "; private String charset = "utf-8"; private String ConnectStr = "JDBC: MySQL: // localhost: 3306/test"; private String username = "root"; private String password = "123456"; private void dostore () löscht classNotFoundException, sqlexception, ioException {class.forname ("com.mysql.jdbc.driver"); connectStr += "? useServerprepstmts = false & rewriteBatchedStatements = true"; // Hier ist ein Test für eine effiziente Stapelinsertion, und das normale Batch -Einfügen wird nach Ausführungsverbindung entfernt conn = (Verbindung) Trivermanager. conn.setAutocommit (false); // Manuelle Einreichung int count = 0 festlegen; PrepedStatement psts = conn.preparestatement (SQL); String line = null; Datum begin = neuer Datum (); für (int i = 0; i <= 100000; i ++) {psts.setString (1, i+"param1"); psts.setString (2, i+"param2"); psts.setString (3, i+"param3"); psts.setString (4, i+"param4"); psts.setString (5, i+"param5"); psts.addbatch (); // Stapelverarbeitungszahl ++ hinzufügen; } psts.executebatch (); // Batch -Verarbeitung Conn.Commit () ausführen; // Datum enden enden = neuer Datum (); System.out.println ("mantity ="+count); System.out.println ("runTime ="+(end.getTime ()-begin.getTime ())); conn.close (); } public static void main (String [] args) {try {new mySqlbatchUtil (). dostore (); } catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); }}}Testergebnisse:
Menge = 100001
Laufzeit = 4725
Insgesamt 10 W, und die Ausführungszeit dauert 47 Sekunden.
Diese Effizienz ist immer noch nicht hoch und scheint nicht den gewünschten Effekt zu erzielen und erfordert eine weitere Verbesserung.
Parameter können auch zur MySQL JDBC -Verbindungszeichenfolge hinzugefügt werden.
RewriteBatchedStatements = true
MySQL hat standardmäßig die Stapelverarbeitung ausgeschaltet und wird durch diesen Parameter eingeschaltet. Dieser Parameter kann die an die Datenbank übermittelte SQL -Anweisung umschreiben.
useServerprepstmts = false
Wenn es nicht aktiviert ist (uaServerprepstmts = false), verwenden Sie com.mysql.jdbc.prepararedStatement für die lokale SQL -Assembly und senden Sie sie schließlich an DB. Es ist die endgültige SQL, die ersetzt wurde.
Hier ist eine kleine Verbesserung, fügen Sie der Verbindungszeichenfolge die folgende Anweisung hinzu (entfernen Sie die Kommentare im Codekonstruktor):
connectStr += "? useServerPrepstmts = false & rewritebatchedStatements = true";
Die Testergebnisse sind wie folgt:
Menge = 100001
Laufzeit = 1213
Mit der gleichen Datenmenge dauerte die Ausführung diesmal nur 12 Sekunden, was zeigt, dass die Verarbeitungseffizienz stark verbessert wurde. Haha
Das obige ist die Testerffizient für die Verwendung von JDBC zum Einfügen von 10W -Daten in MySQL -Datenbankstapel. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!