Mam aplikację java z zapleczem bazy danych Oracle, w której muszę wstawić wiele wierszy. Widziałem dyskusję na temat inserting multiple rows into Oracle, ale jestem również zainteresowany tym, w jaki sposób wpływ na wydajność ma JDBC wrzucony do miksu.Wydajność Oracle i JDBC: INSERT ALL vs preparedStatement.addBatch
Widzę kilka możliwości:
Wariant 1: Użyć singe-wiersz wstawić PreparedStatement i wykonać go wielokrotnie:
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();
}
Opcja 2: Budowanie wyrocznią wprowadzeniu wszystkich oświadczenie:
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();
Opcja 3: Użyj funkcji addBatch w 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();
Chyba Inną możliwością byłoby utworzyć plik CSV i korzystać z SQL Loader, ale nie jestem pewien, że rzeczywiście byłoby szybciej, jeśli dodać w napowietrznej tworzenia pliku CSV ...
Która z opcji będzie działać najszybciej?
Proszę udostępnić wyniki pomiarów. Zauważ, że Oracle ma ograniczenie wielkości partii. Jeśli się nie mylę, jest to 1000 rekordów na raz, więc musisz wywoływać 'executeBatch()' co 1000 rekordów. Powiązane: http://stackoverflow.com/questions/2467125/reusing-a-preparedstatement-multiple-times – BalusC
Mam sukcesywnie używane partie o wielkości 2500, ale nie widziałem realnej poprawy wydajności przekraczającej rozmiar 500 –