2012-08-15 25 views
5

Como aclaración: sé que es lo correcto para crear el PreparedStatement fuera del bucle. He hecho esta pregunta solo por curiosidad.Creación de una declaración preparada dentro de un bucle


Supongamos que estoy creando un PreparedStatement dentro de un bucle con siempre la misma consulta SQL.

final String sql = "INSERT INTO ..."; 
while (condition) { 
    ... 
    PreparedStatement statement = connection.prepareStatement(sql); 
    // Fill values of the prepared statement 
    // Execute statement 
    ... 
} 

¿Es esta inútil ya que el objeto PreparedStatement siempre se crea de nuevo? O reconoce la base de datos subyacente que siempre es la misma consulta SQL con el que se crea y reutiliza el PreparedStatement?

+0

Por qué estas creando t él 'PreparedStatement' dentro del ciclo? Coloque la creación fuera del ciclo y vuelva a utilizarla en el ciclo. – Jesper

+2

El objetivo de una declaración preparada es prepararla una vez y usarla varias veces. La implementación real puede depender del controlador, pero deberá verificar las especificaciones para ver si existen reglas reales al respecto. –

+0

@Jesper Sé que es mejor crearlo fuera del circuito. Acabo de hacer esta pregunta por curiosidad. :-) –

Respuesta

1

Algunos conductores hacen caché declaraciones preparadas, sí. Por ejemplo, lea esta documentación de Oracle: http://docs.oracle.com/cd/B10501_01/java.920/a96654/stmtcach.htm

No creo que haya nada que requiera que esto sea cierto para todos los controladores, aunque ciertamente parece una característica probable de muchos controladores JDBC. Suena como MySQL no podría hacer esto: How to use MySQL prepared statement caching?

Dicho esto, si realmente desea utilizar declaraciones preparadas de manera eficiente, parece que se aferran a una instancia de una declaración preparada que utiliza en cada iteración del bucle tiene mucho mas sentido.

+0

+1 para proporcionar la documentación de Oracle –

8

1. Si está utilizando la misma PreparedStatement a lo largo del bucle, a continuación es mejor que mantener elPreparedStatementfuera del bucle.

2. Si tiene DECLARACIÓN SQL, que va cambiando dentro del bucle, sólo vale la pena usarlo en el bucle.

3. Por otra parte, si el cambio de su torre del homenaje, a continuación, sólo tiene que utilizar Statementen lugar dePreparedStatement, de lo contrario se pierde el propósito mismo de PreparedStatement y cuando mantenga su modificación.

1

Dos maneras hasta ahora que sé.

primera manera

Su inserción de registro de uno en uno

final String sql = "INSERT INTO tablename(columnname) Values(?)"; 

PreparedStatement statement = connection.prepareStatement(sql); 

while (condition) { 
statement.setString(1,value); 
statement.executeUpdate(); 
} 

(o)

segunda forma

Inserta toda récord como mayor insertar

final String sql = "INSERT INTO tablename(columnname) Values(?)"; 

PreparedStatement statement = connection.prepareStatement(sql); 

while (condition) { 
statement.setString(1,value); 
statement.addBatch(); 
} 

statement.executeBatch(); 
Cuestiones relacionadas