Te recomendamos que pruebes esta respuesta en un ambiente controlado antes de enviarlo a producción, saludos.
Solución:
La segunda forma es un poco más eficiente, pero una forma mucho mejor es ejecutarlos en lotes:
public void executeBatch(List 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();
Sin embargo, depende de la implementación del controlador JDBC cuántos lotes podría ejecutar a la vez. Por ejemplo, puede querer ejecutarlos cada 1000 lotes:
public void executeBatch(List entities) throws SQLException
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SQL);
)
int i = 0;
for (Entity entity : entities) i == entities.size())
statement.executeBatch(); // Execute every 1000 items.
En cuanto a los entornos de subprocesos múltiples, no necesita preocuparse por esto si adquiere y cierra la conexión y la declaración en el ámbito más corto posible. dentro del mismo bloque de método de acuerdo con el idioma normal de JDBC utilizando la declaración de prueba con recursos como se muestra en los fragmentos anteriores.
Si esos lotes son transaccionales, le gustaría desactivar la confirmación automática de la conexión y solo confirmar la transacción cuando todos los lotes hayan terminado. De lo contrario, puede resultar en una base de datos sucia cuando el primer grupo de lotes tuvo éxito y el último no.
public void executeBatch(List 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;
El ciclo en su código es solo un ejemplo demasiado simplificado, ¿verdad?
Sería mejor crear el PreparedStatement
solo una vez, y reutilícelo una y otra vez en el bucle.
En situaciones donde eso no es posible (porque complicó demasiado el flujo del programa), aún es beneficioso usar un PreparedStatement
incluso si lo usa solo una vez, porque el lado del servidor del trabajo (analizar el SQL y almacenar en caché el plan de ejecución) aún se reducirá.
Para abordar la situación en la que desea reutilizar el lado de Java PreparedStatement
algunos controladores JDBC (como Oracle) tienen una función de almacenamiento en caché: si crea un PreparedStatement
para el mismo SQL en la misma conexión, le dará la misma instancia (en caché).
Acerca de los subprocesos múltiples: no creo que las conexiones JDBC se puedan compartir entre varios subprocesos (es decir, se pueden usar simultáneamente por varios subprocesos) de todos modos. Cada subproceso debe obtener su propia conexión del grupo, usarla y devolverla al grupo nuevamente.
Si eres capaz, tienes la opción de dejar una reseña acerca de qué te ha impresionado de esta noticia.