Une base de données de connexion est détenue et gérée par la base de données, la classe donne juste vous accédez à cette ressource de base de données. Si vous ne fermez pas la connexion, la classe Java peut être récupérée, mais la base de données ne peut pas indiquer que la connexion n'est plus utilisée, ce qui peut entraîner le gaspillage des ressources de la base de données) ou même fuite.
Donc, quand vous avez terminé avec l'aide de votre Connection
, vous devriez être sûr de fermer explicitement en appelant sa méthode close()
. Cela permettra au garbage collector de se rappeler la mémoire le plus tôt possible et, plus important, il libère toutes les autres ressources de base de données (curseurs, poignées, etc) la connexion peut être maintenue.
La manière traditionnelle de faire en Java est de fermer votre ResultSet
, Statement
et Connection
(dans cet ordre) dans un bloc finally
lorsque vous avez terminé avec eux et le modèle sécuritaire ressemble que:
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 */}
}
}
le bloc finally
peut être légèrement améliorée en (pour éviter le contrôle null):
} finally {
try { rs.close(); } catch (Exception e) { /* ignored */ }
try { ps.close(); } catch (Exception e) { /* ignored */ }
try { conn.close(); } catch (Exception e) { /* ignored */ }
}
Mais, encore, ce qui est extrêmement bavard si vous vous généralement à l'aide une classe d'aide pour fermer les objets dans les méthodes d'assistance null-sécurité et le bloc finally
devient quelque chose comme ça:
} finally {
DbUtil.closeQuietly(rs);
DbUtil.closeQuietly(ps);
DbUtil.closeQuietly(conn);
}
Et, en fait, la Apache Commons DbUtils a une classe DbUtils
qui fait précisément il n'y a donc pas besoin de écrivez votre propre. Dans votre cas, cela résoudra le problème de l'exception, mais pas celui du débogage (et vous gaspillerez des ressources de base de données jusqu'à ce que le délai d'expiration se produise du côté de la base de données). Donc, 1. ne déboguez pas votre code en utilisant une base de données de production. 2. essayez d'exécuter votre session de débogage jusqu'à la fin.
Les gars de Sun étaient INSANE quand ils ont décidé de ne pas avoir de destructeurs. Il était beaucoup plus facile de fermer toutes les ressources ouvertes dans les destructeurs comme en C++. Maintenant, regardez tout ce que nous avons besoin d'écrire pour une petite requête de base de données ... Cela aurait dû être fait en 3 lignes de code: se connecter à db, exécuter une requête, obtenir un résultat. –