La segunda forma es un poco más eficiente, pero de una manera mucho mejor es para su ejecución en lotes:
public void executeBatch(List<Entity> entities) throws SQLException {
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SQL);
) {
for (Entity entity : entities) {
statement.setObject(1, entity.getSomeProperty());
// ...
statement.addBatch();
}
statement.executeBatch();
}
}
Usted es sin embargo dependiente de la implementación del controlador JDBC cuántos lotes se podía ejecutar a la vez . Por ejemplo, puede que desee ejecutarlos cada 1000 lotes:
public void executeBatch(List<Entity> entities) throws SQLException {
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SQL);
) {
int i = 0;
for (Entity entity : entities) {
statement.setObject(1, entity.getSomeProperty());
// ...
statement.addBatch();
i++;
if (i % 1000 == 0 || i == entities.size()) {
statement.executeBatch(); // Execute every 1000 items.
}
}
}
}
En cuanto a los entornos multiproceso, que no es necesario preocuparse por esto si usted adquiere y cerrar la conexión y el estado en el menor grado posible dentro del mismo bloque de método según la expresión JDBC normal usando la instrucción try-with-resources como se muestra en los fragmentos de arriba.
Si esos lotes son transaccionales, entonces desea desactivar la confirmación automática de la conexión y solo confirmar la transacción cuando finalicen todos los lotes. De lo contrario, puede dar lugar a una base de datos sucia cuando el primer grupo de lotes tuvo éxito y el otro no.
public void executeBatch(List<Entity> entities) throws SQLException {
try (Connection connection = dataSource.getConnection()) {
connection.setAutoCommit(false);
try (PreparedStatement statement = connection.prepareStatement(SQL)) {
// ...
try {
connection.commit();
} catch (SQLException e) {
connection.rollback();
throw e;
}
}
}
}
'dentro del mismo bloque de método' - quiere decir que cada subproceso tendrá su propia pila y estas conexiones y declaraciones están en pila desde un lado y de otra fuente de datos dará a cada nueva llamada de executeFunction (== cada hilo) instancia de conexión separada. ¿Te entiendo, verdad?" –
Estoy haciendo el primer método, pero mientras controlo en SQL Profiler, veo repetidas declaraciones preparadas múltiples en lugar de una. No pude entender por qué se muestran varias declaraciones. Se requiere asistencia. – Max