Ich möchte mit Java mehrere Zeilen gleichzeitig in eine MySQL-Tabelle einfügen. Die Anzahl der Zeilen ist dynamisch. In der Vergangenheit habe ich ...
for (String element : array) {
myStatement.setString(1, element[0]);
myStatement.setString(2, element[1]);
myStatement.executeUpdate();
}
Ich möchte dies optimieren, um die von MySQL unterstützte Syntax zu verwenden:
INSERT INTO table (col1, col2) VALUES ('val1', 'val2'), ('val1', 'val2')[, ...]
aber mit a PreparedStatement
weiß ich keine Möglichkeit, dies zu tun, da ich vorher nicht weiß, wie viele Elemente array
enthalten werden. Wenn es mit a nicht möglich ist PreparedStatement
, wie kann ich es sonst tun (und trotzdem die Werte im Array maskieren)?
quelle
connection.setAutoCommit(false);
undconnection.commit();
download.oracle.com/javase/tutorial/jdbc/basics/…i == entities.size()
Wenn der MySQL-Treiber verwendet wird, müssen Sie den Verbindungsparameter
rewriteBatchedStatements
auf true setzen( jdbc:mysql://localhost:3306/TestDB?**rewriteBatchedStatements=true**)
.Mit diesem Parameter wird die Anweisung in Masseneinfügung umgeschrieben, wenn die Tabelle nur einmal gesperrt und die Indizes nur einmal aktualisiert werden. Es geht also viel schneller.
Ohne diesen Parameter ist nur sauberer Quellcode von Vorteil.
quelle
5.1.45
MySQL-Connector-Version.rewriteBatchedStatements=true
gibt es keinen Leistungsgewinn.Wenn Sie Ihre SQL-Anweisung dynamisch erstellen können, können Sie folgende Problemumgehung durchführen:
quelle
Falls Sie ein automatisches Inkrementieren in der Tabelle haben und darauf zugreifen müssen, können Sie den folgenden Ansatz verwenden ... Führen Sie einen Test vor der Verwendung durch, da getGeneratedKeys () in der Anweisung verwendet wird, da dies vom verwendeten Treiber abhängt. Der folgende Code wurde auf Maria DB 10.0.12 und Maria JDBC-Treiber 1.2 getestet
Denken Sie daran, dass das Erhöhen der Stapelgröße die Leistung nur bis zu einem gewissen Grad verbessert. Bei meinem Setup hat das Erhöhen der Stapelgröße über 500 die Leistung tatsächlich beeinträchtigt.
quelle
@Ali Shakiba Ihr Code muss geändert werden. Fehlerteil:
Aktualisierter Code:
quelle
myArray
eine Ausnahme ausgelöst , wenn die Länge größer als diese Grenze ist. In meinem Fall habe ich ein Limit von 1.000 Zeilen, wodurch eine Stapelausführung erforderlich wird, da ich möglicherweise mehr als 1.000 Zeilen in einem bestimmten Lauf aktualisieren kann. Diese Art von Anweisung sollte theoretisch gut funktionieren, wenn Sie wissen, dass Sie weniger als das maximal zulässige einfügen. Etwas zu beachten.In JDBC können mehrere Updates zusammen gesendet werden, um Stapelaktualisierungen zu senden.
Wir können Statement-, PreparedStatement- und CallableStatement-Objekte für die Aktualisierung von Bacth mit deaktiviertem Autocommit verwenden
Die Funktionen addBatch () und executeBatch () sind für alle Anweisungsobjekte mit BatchUpdate verfügbar
Hier fügt die Methode addBatch () dem aktuellen Stapel eine Reihe von Anweisungen oder Parametern hinzu.
quelle