Pregunta ¿Se borran automáticamente los valores de los parámetros después de ejecutar un lote de comandos SQL con Java PreparedStatemen?


Tengo el siguiente fragmento de código:

PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < 100000; i++) {
    preparedStatement.setObject(1, someValue);
    preparedStatement.addBatch();
    if ((i + 1) % 100 == 0) {
        preparedStatement.executeBatch();
    }
}

entonces quiero ejecutar un comando alrededor de 100 000 veces con diferentes valores. Mi pregunta es: ¿los parámetros de PreparedStatement se borran después de cada llamada a executeBatch () o tengo que llamar explícitamente a preparedStatement.clearParameters () después de llamar a executeBatch () para asegurarme de que solo se ejecutarán los últimos 100 comandos? ?


14
2018-02-08 11:36


origen


Respuestas:


Como puedo ver aquí: http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/jdbc/odbc/JdbcOdbcStatement.java.html

executeBatch() llamadas clearBatch() en el final.

Pero no hay garantía de que será exactamente igual en otras implementaciones.


6
2018-02-08 11:46



SÍ. De acuerdo con la sección 15.1.2 de JDBC 3.0 y la sección 14.1.2 de JDBC 4.1:

Al llamar al método executeBatch, se cierra el objeto Statement del llamante   conjunto de resultados actual si uno está abierto. El lote de la declaración se restablece a   vacío una vez que se ejecutaBatch returns.

Es desafortunado que un detalle tan importante terminara casi como una letra pequeña.

Además del ejemplo ya mencionado, el controlador jtds también hace un clearBatch () en el bloque finally de executeBatch ().


9
2018-02-25 05:11



Yo diría que la pregunta más relevante era si el lote está despejado Aunque parece una suposición razonable, salvo la documentación diciendo explícitamente que está despejado (y no veo nada en executeBatch diciendo eso), usaría clearBatch explícitamente en la teoría de que si una implementación hace limpiar el lote, clearBatch será un rápido no-op; y si no lo hace, bueno, entonces tenía que hacerlo.

Actualizar: Mientras que la executeBatch la documentación no lo dice, ver La respuesta de Bogdan Calmac: Aparentemente la documentación de JDBC hace digamos que la finalización exitosa borra el lote.


6
2018-02-08 11:44



Prefiero decir que es mejor borrarlo explícitamente. Algunos controladores JDBC no borran los búferes internos después executeBatch().
Una llamada explícita a clearBatch() es necesario para evitar errores como IndexOutOfBoundException como algunos errores lógicos también pueden ser introducidos.

¡Gracias!


1
2018-01-06 04:21



Preguntas populares