una conexión de base es propiedad y está gestionado por la base de datos, la clase sólo da usted tiene acceso a ese recurso de base de datos. Si no cierra la conexión, la clase Java puede ser basura, pero es posible que la base de datos no advierta que la conexión ya no está en uso, lo que puede ocasionar desperdicio de recursos de la base de datos (hasta un tiempo de espera en el lado de la base de datos)) o incluso fugas.
Así que, cuando haya terminado con el uso del Connection
, usted debe estar seguro de para cerrar explícitamente llamando a su método close()
. Esto permitirá que el recolector de basura recupere memoria tan pronto como sea posible y, más importante, libera cualquier otro recurso de base de datos (cursores, identificadores, etc.) a los que la conexión se pueda retener.
La forma tradicional de hacer esto en Java es cerrar los ResultSet
, Statement
y Connection
(en ese orden) en un bloque finally
cuando haya terminado con ellos y el patrón de seguridad se ve así:
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// Do stuff
...
} catch (SQLException ex) {
// Exception handling stuff
...
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) { /* ignored */}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) { /* ignored */}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) { /* ignored */}
}
}
el bloque finally
puede ser mejorado ligeramente en (para evitar el cheque nulo):
} finally {
try { rs.close(); } catch (Exception e) { /* ignored */ }
try { ps.close(); } catch (Exception e) { /* ignored */ }
try { conn.close(); } catch (Exception e) { /* ignored */ }
}
Pero, aún así, esto es extremadamente detallado por lo que generalmente terminan usando una clase de ayuda a cerrar los objetos en los métodos de ayuda nulos de fallos y el bloque finally
se convierte en algo así:
} finally {
DbUtil.closeQuietly(rs);
DbUtil.closeQuietly(ps);
DbUtil.closeQuietly(conn);
}
Y, en realidad, la Apache Commons DbUtils tiene una clase DbUtils
que está haciendo precisamente lo que no hay necesidad de escribe lo tuyo.
En su caso, esto resolverá el problema de la excepción, pero no la depuración (y desperdiciará los recursos de la base de datos hasta que ocurra el tiempo de espera en el lado de la base de datos). Entonces 1. no depure su código usando una base de datos de producción 2. intente ejecutar su sesión de depuración hasta el final.
Los chicos de Sun estaban INSANE cuando decidieron no tener destructores. Era mucho más fácil cerrar cualquier recurso abierto en destructores como en C++. Ahora, solo miren toda esa basura que necesitamos escribir solo para una consulta de base de datos pequeña ... Se debería haber hecho en 3 líneas de código: conectarse a db, ejecutar consulta, obtener resultado. –