Los siguientes procedimientos se debe hacer (en orden)
- El
ResultSet
- El
PreparedStatement
- El
Connection
.
Además, es aconsejable cerrar todos los objetos relacionados con JDBC en el finally
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());
}
}
Se puede ver que he comprobado si mis objetos son nulos y para la conexión, compruebe primera si no se autocommited la conexión. Muchas personas no lo comprueban y se dan cuenta de que la transacción no se ha comprometido con DB.
¿Dónde lo viste? – BalusC
Aunque según la especificación, la declaración debe cerrarse cuando se cierra la conexión, se ha visto que los controladores JDBC tienen problemas con esto, por lo que se considera una buena práctica cerrar explícitamente la instrucción (y el conjunto de resultados). – Yishai
Cierre las cosas en el orden inverso al que las abrió. Todas las cosas. – EJP