java - preparestatement - ¿Qué debo cerrar primero, PreparedStatement o Connection?
preparedstatement java insert (2)
La declaración. Yo esperaría que cierres (en orden)
- el conjunto de resultados
- la declaración
- la conexión
(¡y busca nulos en el camino!)
es decir, cerrar en orden inverso a la secuencia de apertura.
Si usa Spring JdbcTemplate (o similar), eso lo JdbcTemplate por usted. Alternativamente, puede utilizar Apache Commons DbUtils y DbUtils.close()
o DbUtils.closeQuietly()
.
Cuando utilizo un Estado PreparedStatement
en JDBC, ¿debería cerrar primero PreparedStatement
o Connection
? Acabo de ver un ejemplo de código en el que la Connection
se cierra primero, pero me parece más lógico cerrar primero PreparedStatement
.
¿Existe una forma estándar y aceptada de hacer esto? ¿Importa? ¿El cierre de Connection
también hace que se cierre el PreparedStatement
, ya que el PreparedStatement
está directamente relacionado con el objeto Connection
?
Los siguientes procedimientos deben hacerse (en orden)
- El
ResultSet
- The
PreparedStatement
- La
Connection
.
Además, es aconsejable cerrar todos los objetos relacionados con JDBC en el cierre final para garantizar el cierre.
//Do the following when dealing with JDBC. This is how I''ve implemented my JDBC transactions through DAO....
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = ....
ps = conn.prepareStatement(...);
//Populate PreparedStatement
rs = ps.executeQuery();
} catch (/*All relevant exceptions such as SQLException*/Exception e) {
logger.error("Damn, stupid exception: " , e);
} finally {
if (rs != null) {
try {
rs.close();
rs = null;
} catch (SQLException e) {
logger.error(e.getMessage(), e.fillInStackTrace());
}
}
if (ps != null) {
try {
ps.close();
ps = null;
} catch (SQLException e) {
logger.error(e.getMessage(), e.fillInStackTrace());
}
}
try {
if (conn!= null && !conn.isClosed()){
if (!conn.getAutoCommit()) {
conn.commit();
conn.setAutoCommit(true);
}
conn.close();
conn= null;
}
} catch (SQLException sqle) {
logger.error(sqle.getMessage(), sqle.fillInStackTrace());
}
}
Puede ver que he comprobado si mis objetos son nulos y para la conexión, compruebe primero si la conexión no se confirma automáticamente. Muchas personas no lo comprueban y se dan cuenta de que la transacción no se ha comprometido con DB.