2017-10-21 89 views
0

Pour une connexion JDBC, je suis conscient que Java va créer un socket avec le numéro de port et le flux ouvert de connexion entre lui et le serveur DB avec son numéro de port spécifié, nom de base de données et peut-être d'autres options, la fermeture de cette ressource est clairement nécessaire. Mais pour Statement, avec ResultSet, quelles sont les ressources qui sont détenues par eux, nous devons les fermer? Je veux dire techniquement.Quelles sont les ressources détenues par l'objet instruction

+0

Pour un 'ResultSet', c'est le curseur de la base de données. Fondamentalement, une base de données ne récupérera pas toujours tous les résultats avec empressement - elle conservera plutôt un index temporaire de références aux résultats eux-mêmes et les récupérera à la demande. La ressource est libérée lorsque vous fermez le 'ResultSet'. Pour une 'PreparedStatement' (généralement pas pour une' Statement' normale), une instruction préparée sur le serveur. –

+1

@PiotrWilkin Pourquoi utiliser un commentaire pour répondre? Vous auriez pu poster ceci comme une vraie réponse. –

Répondre

1

Si les ressources sont réellement détenues par une instruction ou un jeu de résultats, cela dépend beaucoup de la base de données et du pilote spécifiques.

Un Statement en Java pourrait avoir une contrepartie (déclaration poignée) dans la base de données, avec une mémoire pour une déclaration, la configuration comme les délais d'attente, chercher la taille, des tampons, etc. Pour une Statement plaine ce n'est pas toujours le cas, mais Pour PreparedStatement, le descripteur d'instruction de la base de données contient généralement une version de l'instruction compilée avec son plan d'exécution, etc.

La fermeture de l'objet d'instruction en Java libère ce handle dans la base de données (ou peut-être le réutiliser pour une utilisation ultérieure). déclaration différente), et pourrait par exemple libérer des «verrous d'existence» sur les métadonnées (par exemple, empêcher la suppression d'une table pendant qu'elle est encore utilisée/préparée). En outre, la fermeture de l'instruction en Java fermera tous les ensembles de résultats ouverts, ce qui pourrait libérer de la mémoire dans Java et dans la base de données. La fermeture du jeu de résultats lui-même présente également des avantages évidents, un jeu de résultats peut contenir de la mémoire en Java (par exemple, des lignes pré-extraites, parfois le résultat complet), donc la fermeture du jeu de résultats libèrera ces lignes pré-récupérées. Cela s'applique en particulier si vous n'avez pas entièrement lu le jeu de résultats ou si vous utilisez un jeu de résultats déroulant. Un jeu de résultats peut également avoir un curseur (ou similaire) du côté de la base de données qui pointe vers la dernière ligne récupérée, verrouille sur des lignes (par exemple dans une instruction select for update), et peut-être contient également un certain nombre de récupéré des lignes en mémoire. La fermeture du jeu de résultats libère la mémoire et tous les verrous, etc.

En d'autres termes: oui, vous devriez fermer les ensembles de résultats et les instructions, et vous devriez le faire dès que vous en avez fini avec eux.