La fermeture de Connexions de Base de données en Java
Je suis un peu confus, je lisais le ci-dessous de http://en.wikipedia.org/wiki/Java_Database_Connectivity
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor",
"myLogin",
"myPassword" );
Statement stmt = conn.createStatement();
try {
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
} finally {
//It's important to close the statement when you are done with it
stmt.close();
}
Ne vous est pas nécessaire de fermer la Connexion conn?
Ce qui se passe si les conn.close() ne se produit pas?
J'ai une web app, je suis le maintien qui n'est pas actuellement à proximité une ou l'autre forme, mais est le plus important vraiment la stmt un, la conn un, ou les deux?
Le site continue à aller vers le bas de façon intermittente, mais le serveur continue à dire que c'est une base de données de problème de connexion, je soupçonne que ce n'est pas fermée, mais je ne sais pas qui, si tout fermer.
- Il est toujours recommandé de fermer les connexions sur votre propre, sans dépendre des autres pilotes et les modèles à poignée de fermeture. L'échec de la fermeture de la connexion entraînera dans les supports et les ressources ouvert à jamais jusqu'à ce qu'un crash(pas plus de scénario de ressources) ou redémarrez-le.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous avez terminé avec l'aide de votre
Connection
, vous devez fermer explicitement en appelant sonclose()
méthode afin de libérer tous les autres ressources de base de données (curseurs, poignées, etc.), la connexion peut être tenue sur.En fait, le coffre-fort de modèle en Java est de fermer votre
ResultSet
,Statement
, etConnection
(dans cet ordre) dans unfinally
bloquer lorsque vous avez terminé avec eux, quelque chose comme ça:La
finally
bloc peut être légèrement améliorée dans (pour éviter le nul à vérifier):Mais, tout de même, ce qui est extrêmement détaillé de sorte que vous finissent généralement à l'aide d'une classe d'aide à fermer les objets en null-safe méthodes d'assistance et la
finally
bloc devient quelque chose comme ça:Et, en fait, la Apache Commons DbUtils a un
DbUtils
classe, qui est, précisément, donc il n'est pas nécessaire d'écrire votre propre.rs
,ps
,conn
peut êtrenull
selon l'endroit où le code des pauses. C'est pourquoi ceci est connu comme la "sécurité" de modèle.close
méthode deStatement
objet se ferme automatiquement les associésResultSet
si la déclaration a un résultat ouvert. De même, laclose
méthode de laConnection
classe ferme toutes lesStatements
de laConnection
.function()
?Il est toujours préférable de fermer la base de données/objets de ressource après utilisation.
Mieux pour fermer la connexion, jeu de résultats et de déclaration des objets dans la
finally
bloc.Jusqu'à Java7, toutes ces ressources doit être fermé à l'aide d'un
finally
bloc.Si vous êtes à l'aide de Java 7, puis de la fermeture de la ressources que vous pouvez faire comme suit.
Maintenant, con, stmt et rs objets deviennent une partie de bloc try et java se ferme automatiquement ces ressources après utilisation.
Espère que j'ai été utile.
ResultSet rs = conn.createStatement().executeQuery(sql);
à l'intérieur de latry
bloc?Il suffit de fermer juste
Statement
etConnection
. Il n'est pas nécessaire de fermer explicitement laResultSet
objet.De documentation de Java dit à propos de
java.sql.ResultSet
:Grâce BalusC pour les commentaires: "je ne voudrais pas compter sur cela. Certains pilotes JDBC échouer sur que."
Oui. Vous devez fermer le jeu de résultats, l'état et la connexion. Si la connexion est venu d'une piscine, clôture, il envoie de nouveau à la piscine pour une réutilisation.
Vous avez l'habitude de le faire dans un
finally{}
bloc, de telle sorte que si une exception est levée, vous avez toujours la possibilité de fermer cette.De nombreux cadres de s'occuper de cette ressource d'allocation/désallocation de problème pour vous. par exemple, au Printemps JdbcTemplate. Apache DbUtils a des méthodes pour s'occuper de la fermeture de la resultset/déclaration/connexion si la valeur null ou pas (et attraper les exceptions à la clôture), ce qui peut aussi aider.
Oui, vous avez besoin de fermer la Connexion. Sinon, la base de données client en général garder à la connexion de socket et d'autres ressources ouvertes.
En fait, il est préférable si vous utilisez un try-with-resources bloc et Java va fermer toutes les connexions pour vous lorsque vous quittez le bloc try.
Vous devez faire cela avec n'importe quel objet qui implémente AutoClosable.
L'appel à getDatabaseConnection est simplement constituée. Le remplacer par un appel qui vous obtient un JDBC SQL connexion ou une connexion à partir d'un pool.