Es imprescindible interpretar el código de forma correcta antes de utilizarlo a tu trabajo si ttienes algo que aportar puedes compartirlo con nosotros.
Solución:
Cuando haya terminado de usar su Connection
debe cerrarlo explícitamente llamando a su close()
para liberar cualquier otro recurso de la base de datos (cursores, identificadores, etc.) que la conexión pueda estar reteniendo.
En realidad, el patrón seguro en Java es cerrar su ResultSet
, Statement
y Connection
(en ese orden) en un finally
bloquear cuando haya terminado con ellos. Algo como esto:
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 */
Él finally
bloque se puede mejorar ligeramente en (para evitar el null cheque):
} 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 termina usando una clase auxiliar para cerrar los objetos en null-Métodos de ayuda seguros y el finally
bloque se convierte en algo como esto:
} finally
DbUtils.closeQuietly(rs);
DbUtils.closeQuietly(ps);
DbUtils.closeQuietly(conn);
Y, en realidad, Apache Commons DbUtils tiene un DbUtils
class que precisamente está haciendo eso, por lo que no hay necesidad de escribir el suyo propio.
Siempre es mejor cerrar los objetos de base de datos/recursos después de su uso. Mejor cierre la conexión, el conjunto de resultados y los objetos de declaración en el finally
cuadra.
Hasta Java 7, todos estos recursos deben cerrarse mediante un finally
cuadra. Si está utilizando Java 7, entonces para cerrar los recursos, puede hacer lo siguiente.
try(Connection con = getConnection(url, username, password, "org.postgresql.Driver");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
)
// Statements
catch(....)
Ahora el con
, stmt
y rs
los objetos pasan a formar parte del bloque de prueba y Java cierra automáticamente estos recursos después de su uso.
Basta con cerrar Statement
y Connection
. No es necesario cerrar explícitamente el ResultSet
objeto.
La documentación de Java dice acerca de java.sql.ResultSet
:
Un objeto ResultSet es cerrado automáticamente por el objeto Statement que lo generó cuando ese objeto Statement se cierra, se vuelve a ejecutar o se usa para recuperar el siguiente resultado de una secuencia de múltiples resultados.
Gracias BalusC por los comentarios: “No confiaría en eso. Algunos controladores JDBC fallan en eso”.
Te mostramos las comentarios y valoraciones de los usuarios
Recuerda que tienes concesión de decir si te fue útil.