Ne réutilisation d'une Déclaration et Resultset de libérer les ressources de son utilisation antérieure? Ou dois-je fermer explicitement eux avant de les réutiliser?
Exemple de code:
aStmt = aConn.prepareStatement(aQuery);
aRset = aStmt.executeQuery(cQuery);
while (cRset.next()) {
//stuff to determine value of parm1
aStmt.setString(1, parm1);
aRset = aStmt.executeQuery();
//more stuff
}
Dois-je fermer aStmt et aRset après chaque boucle à l'intérieur de l'instruction while? Ou va les réutiliser dans la réussir boucles de libérer de la mémoire/ressources utilisées à partir de la précédente boucles?
Vous devez vous connecter pour publier un commentaire.
Le comportement de jeux de résultats et (préparé) états est explicitement décrite dans l'API Java. Je vous suggère de lire la documentation disponible (et JDBC spec) pour obtenir les détails.
La
Déclaration
API dit:(l'emphase est mienne).
Dans votre code, lorsque vous appelez
aStmt.executeQuery()
, l'ancienResultSet
attribué àaRset
est fermé implicitement par le pilote. Cela dit, il serait préférable de fermer explicitement-le vous-même (ou l'utilisation de Java 7 try-with-resources), pour vous éviter d'oublier de fermer laResultSet
dans la dernière itération de la boucle.Maintenant à la
PreparedStatement
: Lorsque vous préparez une déclaration (en général, la mise en œuvre peut varier), la requête est envoyée au serveur pour la compilation. Sur l'exécution des paramètres pour l'exécution est envoyé au serveur. L'appel declose()
suraStmt
entraînerait l'instruction préparée être libéré sur le serveur, c'est clairement PAS ce que vous voulez comme vous le voulez ré-utiliser l'instruction avec les différentes valeurs de ce paramètre.Donc en bref
ResultSet
n'est pas techniquement nécessaire ici (sauf pour la dernièreResultSet
créé), mais il est préférable de le faire explicitementPreparedStatement
lorsque vous avez terminé avec elle.À l'aide de try-with-resources est une façon pour enlever une partie de la confusion sur ces questions, comme votre code sera automatiquement libérer des ressources lorsque cela est fait avec elle (à la fin de la portée de l'utilisation):
À la fin de ce morceau de code toutes les ressources JDBC sont correctement fermés (dans le bon ordre, même si des exceptions s'est produite etc)
Non, vous ne pouvez pas fermer la
ResultSet
etStatement
à l'intérieur de lawhile
boucle.Vous avez à les refermer après la boucle.
Aussi, si vous voulez réutiliser le
PreparedStatement
alors vous ne pouvez pas le fermer jusqu'à ce que vous êtes prêt avec votre traitement.Meilleure règle est de fermer ces ressources dans le même bloc que ils sont créés. Dans votre cas, la meilleure chose à faire est de fermer les ressources dans un
finally
bloc après la capture de laSQLException
.E. g.
Dans Java 7, vous pouvez utiliser l'essayer avec des ressources.
PreparedStatement API: UNE instruction SQL est précompilé et stockées dans un objet PreparedStatement. Cet objet peut ensuite être utilisé pour exécuter efficacement cette déclaration à plusieurs reprises.
Mais vous ne pouvez pas réutiliser un objet ResultSet. Lorsque vous appelez executeQuery sur un objet PreparedStatement la deuxième fois qu'un nouveau jeu de résultats est créé, si vous ne fermez pas le précédent jeu de résultats, vous risquez d'obtenir une fuite de ressources.
ResultSet
si un nouveau est créé à partir de la mêmeStatement
objet.