Tengo una aplicación Java con un back-end de base de datos Oracle en el que necesito insertar varias filas. He visto la discusión sobre inserting multiple rows into Oracle, pero también estoy interesado en cómo se ve afectado el rendimiento cuando se lanza JDBC en la mezcla.Rendimiento Oracle y JDBC: INSERTAR TODOS vs preparedStatement.addBatch
veo algunas posibilidades:
Opción 1: Utilice un singe-fila de inserción PreparedStatement y ejecutarlo varias veces:
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();
}
Opción 2: Construir un Oracle insertar todos afirmación:
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();
Opción 3: uso la funcionalidad addBatch de 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();
supongo que otra posibilidad sería la creación de un archivo CSV y utilizar el cargador de SQL, pero no estoy seguro de que sería realmente más rápido si se añade a la sobrecarga de crear el archivo CSV ...
Entonces, ¿qué opción sería la más rápida?
Por favor, comparta los resultados de sus mediciones. Tenga en cuenta que Oracle tiene una limitación en el tamaño del lote. Si no me equivoco, son 1000 registros a la vez, por lo que debe llamar a 'executeBatch()' cada 1000 registros. Relacionado: http://stackoverflow.com/questions/2467125/reusing-a-preparedstatement-multiple-times – BalusC
He usado con éxito tamaños de lote de 2500, pero no he visto una mejora real en el rendimiento más allá de un tamaño de 500 –