Se recomienda encarecidamente cerrar objetos JDBC (conexiones, instrucciones, conjuntos de resultados) cuando termine de usarlos. Sin embargo, lo que produce un montón de código así:Ayudante genérico para cerrar objetos JDBC
Connection conn = null;
Statement stm = null;
ResultSet res = null;
try {
// Obtain connection/statement, get results, whatever...
} catch (SQLException e) {
// ...
} finally {
if (res != null) { try { res.close(); } catch (SQLException ignore) {}}
if (stm != null) { try { stm.close(); } catch (SQLException ignore) {}}
if (conn != null) { try { conn.close(); } catch (SQLException ignore) {}}
}
Ahora pensé en la reducción de la cantidad de código (repetición) para el cierre de los objetos mediante la implementación de una función de ayuda. Toma los objetos como argumentos e intenta invocar el método close()
de cada objeto (si el objeto tiene dicho método), utilizando la reflexión.
public void close(Object... objects) {
for (Object object : objects) {
for (Method method : object.getClass().getMethods()) {
if (method.getName().equals("close")) {
try {
method.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
break; // break on the methods, go for the next object
}
}
}
}
El bloque finally
puede reducirse a esto:
} finally {
close(res, stm, conn);
}
es que una buena cosa que hacer? Si no, ¿cuáles son las razones? ¿Hay una manera "mejor"?
En cuanto a 3., eso es lo que estoy intentando con ese método de ayuda. :) Se implementa en una clase base que todas las clases relacionadas con db extienden. La forma de Java7 necesita varios bloques de try-with-resource anidados, ¿verdad? Uno para conn, uno para stm, uno para res. – riha
No, debería poder especificarlas todas en una que yo crea. Mira la edición que hice a mi ejemplo. –
Por otra parte, a veces las asignaciones res y stm dependen del código en el bloque try. ¿Cómo abordarías eso? – riha