Saltar al contenido

Reutilizar un PreparedStatement varias veces

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 PreparedStatementincluso 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 PreparedStatementalgunos 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *