Ich habe eine Java-App mit einer Oracle-Datenbank-Backend, die ich brauche, um mehrere Zeilen in einzufügen. Ich habe die Diskussion gesehen über Einfügen mehrerer Zeilen in Oracle aber ich bin auch daran interessiert, wie die Leistung beeinflusst wird, wenn JDBC in den Mix geworfen wird.
Ich sehe ein paar Möglichkeiten:
Option 1: Verwenden Sie ein PreparedStatement zum Einfügen einer einzigen Zeile und führen Sie es mehrmals aus:
String insert = "Insert into foo(bar, baz) values (?, ?)";
PreparedStatement stmt = conn.prepareStatement(insert);
for(MyObject obj : someList) {
stmt.setString(1, obj.getBar());
stmt.setString(2, obj.getBaz());
stmt.execute();
}
Möglichkeit 2: Erstellen Sie eine Oracle INSERT ALL-Anweisung:
String insert = "INSERT ALL " +
"INTO foo(bar, baz), (?, ?) " +
"INTO foo(bar, baz), (?, ?) " +
"SELECT * FROM DUAL";
PreparedStatement stmt = conn.prepareStatement(insert);
int i=1;
for(MyObject obj : someList) {
stmt.setString(i++, obj.getBar());
stmt.setString(i++, obj.getBaz());
}
stmt.execute();
Option 3: Verwenden Sie die addBatch-Funktionalität von PreparedStatement:
String insert = "Insert into foo(bar, baz) values (?, ?)";
PreparedStatement stmt = conn.prepareStatement(insert);
for(MyObject obj : someList) {
stmt.setString(1, obj.getBar());
stmt.setString(2, obj.getBaz());
stmt.addBatch();
}
stmt.execute();
Ich schätze, eine andere Möglichkeit wäre, eine CSV-Datei zu erstellen und den SQL Loader zu verwenden, aber ich bin mir nicht sicher, ob das wirklich schneller wäre, wenn man den Aufwand für die Erstellung der CSV-Datei hinzurechnet...
Welche Option würde also am schnellsten funktionieren?