La fermeture de Connexions JDBC dans la Piscine
Notre standard section de code pour l'utilisation de JDBC est...
Connection conn = getConnection(...);
Statement stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rset = stmt.executeQuery (sqlQuery);
//do stuff with rset
rset.close(); stmt.close(); conn.close();
Question 1: Lors de l'utilisation d'un Pool de Connexion, doit-on fermer la Connexion à la fin? Si oui, n'est-ce pas le but de la mise en commun perdu? Et si non, en quoi la source de données de savoir quand une instance particulière de la Connexion est libérée et peut être réutilisé? Je suis un peu confus sur ce point, tous les pointeurs apprécié.
Question 2: la méthode suivante tout proche du standard? Ressemble à une tentative pour obtenir une connexion à partir de la piscine, et si la source de données ne peut pas être établie, l'utilisation de l'ancienne, DriverManager. Nous ne sommes même pas sûrs de la pièce qui est arriver exécutée au moment de l'exécution.
Répéter la question ci-dessus, doit-on fermer la Connexion en sortant d'une telle méthode?
Je vous remercie, MME
synchronized public Connection getConnection (boolean pooledConnection)
throws SQLException {
if (pooledConnection) {
if (ds == null) {
try {
Context envCtx = (Context)
new InitialContext().lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");
return ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
}}
return (ds == null) ? getConnection (false) : ds.getConnection();
}
return DriverManager.getConnection(
"jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}
Edit: je pense que nous sommes les pools de connexion, car nous ne voyons pas une trace de la pile.
Vous devez vous connecter pour publier un commentaire.
Oui, certes, vous avez besoin de fermer la connexion du jeu ainsi. C'est en fait un wrapper autour de la connexion réelle. Elle sera sous les couvertures de libération de la connexion réelle de retour à la piscine. C'est plus de la piscine pour décider si la connexion va fait être fermés ou être réutilisé pour une nouvelle
getConnection()
appel. Donc, peu importe si vous êtes en utilisant un pool de connexion ou pas, vous devriez toujours fermer toutes les ressources JDBC dans l'ordre inverse dans lefinally
bloc de latry
bloc où vous l'avez acquis. Dans Java 7 ceci peut être encore simplifiée par l'utilisation detry-with-resources
déclaration.L'exemple est assez effrayant. Vous avez juste besoin de recherche/initialisation de la
DataSource
qu'une seule fois au démarrage de l'application, dans certains constructeur /initialisation d'un applicationwide config DB classe. Puis il suffit d'appelergetConnection()
sur une seule et même source de données dans tout le reste de l'application de la durée de vie. Pas besoin de synchronisation ni nullchecks.Voir aussi:
getConnection()
est bizarre. Juste le faire en c'tor ou de l'initialisation du bloc de la même catégorie, sans synchronisation/nullchecks. Il va être appelé qu'une seule fois. Pour plus de conseils et d'envoi des exemples, vous pouvez trouver cet article utile.IN
clause, 3) utiliser le chargement paresseux dans la propriété de lecture (comme Hibernate/JPA, sous les couvertures ne).close()
sur chacun d'eux dans lefinally
bloc de la mêmetry
bloc où vous avez acquis ou créés. C'est complètement indépendamment de si c'est un pool de connexion ou pas.Les piscines généralement de retour que vous enveloppé d'un objet de Connexion, où la méthode close() est redéfinie, généralement le retour de la Connexion à la piscine. L'appel à close() est OK et sans doute encore nécessaires.
Une méthode close() serait probablement ressembler à ceci:
Pour votre deuxième question, vous pouvez ajouter un enregistreur de montrer que le fond de bloc de jamais s'exécute. J'imagine bien que vous ne voulez, d'une manière ou l'autre pour la configuration de vos connexions de base de données. Nous avons uniquement l'utilisation d'une piscine pour notre base de données d'accès. De toute façon, la fermeture de la connexion serait assez important pour éviter les fuites.
Calling close() is OK and probably still required.
, pas d'appel à proximité de fuite à la connexion, à moins que la piscine met en œuvre une certaine reprise de la stratégieEn fait, la meilleure approche pour la gestion de la connexion est de ne pas en faire l'élevage à aucun code n'importe où.
Créer un SQLExecutor classe qui est le seul et unique emplacement qui ouvre et ferme les connexions.
L'ensemble du reste de l'application, puis les pompes de déclarations dans l'exécuteur plutôt que d'obtenir des connexions à partir de la piscine et de la gestion (ou la mauvaise gestion de mer) tous sur la place.
Vous pouvez avoir autant d'instances de l'interprète que vous voulez, mais nul ne doit être l'écriture de code qui ouvre et ferme les connexions sur son propre compte.
Idéalement, cela vous permet de vous connecter à tous vos SQL à partir d'un seul ensemble de code.