2011-11-24 11 views
14

Básicamente he (ignorando el manejo de excepciones, etc.):¿Puedo cerrar declaraciones en una transacción antes de comprometerla en Derby (JDBC)?

connection.setAutoCommit(false); 

Statement statement1 = connection.createStatement(); 
statement1.executeUpdate("..."); 
statement1.close(); 

Statement statement2 = connection.createStatement(); 
statement2.executeUpdate("..."); 
statement2.close(); 

connection.commit(); 

si he entendido bien, no debería tener ningún impacto debido a todo lo que realmente hace es liberar los recursos para la GC. Especially with Derby: debe cerrar explícitamente Declaraciones, ResultSets y Conexiones cuando ya no los necesite. Las conexiones a Derby son recursos externos a una aplicación, y el recolector de basura no las cerrará automáticamente.

¿Sin embargo, causará problemas con la transacción? No creo que la transacción se base en la Declaración. ¿Alguien puede confirmar esto?

+0

Parece que, si cierra una instrucción, la _transacción_ aún está abierta en el lado de la base de datos (esperando confirmación o reversión). Solo se finaliza/cierra cuando se emite un comando commit o rollback a la conexión. ¿Estoy en lo cierto? – ADTC

Respuesta

15

Absolutamente, puede cerrarlas, y debería.

+2

+1 para "debería" –

+0

Estoy de acuerdo. ¿Pero puede ser ANTES de que la transacción haya terminado o tiene que ser después de que la transacción se haya completado? –

6

En general, una vez que se ejecuta Statement, la fuente de datos/base de datos subyacente es responsable de garantizar una ejecución exitosa. Se espera que las fallas den como resultado SQLException s lanzadas en las invocaciones Statement.executeXXX. Y cualquier ejecución exitosa daría como resultado que la base de datos rastreara estas actualizaciones en un área de trabajo temporal. El compromiso de la transacción simplemente garantiza que las actualizaciones causadas por las declaraciones se escriban en una tienda duradera, desde el área de trabajo temporal. Este es a menudo el caso en la mayoría de las bases de datos.

Por lo tanto, es seguro cerrar un objeto Statement una vez que ya no lo necesite, sin encontrar ningún efecto secundario en la transacción.

0

Por supuesto, es seguro cerrar las declaraciones antes de comprometer las transacciones. Debería leer - Closing Statement object prior to committing de coderanch y JDBC Transactions tutorial.

+2

Lo hice, ambos de hecho. Los comentarios de Java Ranch comienzan con "Yo creo", lo cual no es una confirmación, y nadie lo amplió, la discusión fue en una tangente. El tutorial JDBC cierra los enunciados en el bloque finally, después de la confirmación. Y no se menciona lo que sucederá si cierra la Declaración antes. Por lo tanto, tenga cuidado en sus comentarios, no es obvio, ni está indicado en ninguna de esas referencias ... –

1

Sí. Es una buena práctica y enfoque para cerrar declaración antes de comprometer las transacciones.

Cuestiones relacionadas