Notre section de code standard 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 du pool de connexions, faut-il fermer la connexion à la fin? Si tel est le cas, l'objectif de la mise en commun n'est-il pas perdu? Et sinon, comment DataSource sait-il quand une instance particulière de Connection est libérée et peut être réutilisée? Je suis un peu confus sur celui-ci, tous les pointeurs sont appréciés.
Question 2: La méthode suivante est-elle proche de la norme? Ressemble à une tentative d'obtenir une connexion à partir du pool, et si DataSource ne peut pas être établi, utilisez l'ancien DriverManager. Nous ne savons même pas quelle partie est exécutée au moment de l'exécution. En répétant la question ci-dessus, faut-il fermer la connexion en sortant d'une telle méthode?
Merci, - MS.
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 obtenons la connexion groupée car nous ne voyons pas de trace de pile.
la source
getConnection()
c'est bizarre. Faites-le simplement dans c'tor ou dans un bloc d'initialisation de la même classe, sans synchronisation / nullchecks. Il ne sera appelé qu'une seule fois. Pour plus de conseils et d'exemples de lancement, cet article peut vous être utile.close()
tous dans lefinally
bloc du mêmetry
bloc que celui où vous les avez acquis / créés. Ceci est totalement indépendant du fait qu'il s'agisse d'une connexion groupée ou non.Les pools vous renvoient généralement un objet Connection encapsulé, où la méthode close () est remplacée, renvoyant généralement la Connection au pool. L'appel de close () est OK et probablement toujours nécessaire.
Une méthode close () ressemblerait probablement à ceci:
Pour votre deuxième question, vous pouvez ajouter un enregistreur pour montrer si le bloc inférieur s'exécute jamais. J'imagine que vous ne voudriez que d'une manière ou d'une autre pour la configuration de vos connexions de base de données. Nous utilisons uniquement un pool pour nos accès à la base de données. Dans tous les cas, la fermeture de la connexion serait très importante pour éviter les fuites.
la source
Calling close() is OK and probably still required.
, ne pas appeler close entraînera une fuite de la connexion, à moins que le poolEn fait, la meilleure approche de la gestion des connexions est de ne pas les restreindre à un code n'importe où.
Créez une classe SQLExecutor qui est le seul et unique emplacement qui ouvre et ferme les connexions.
L'ensemble du reste de l'application pompe ensuite les instructions dans l'exécuteur plutôt que d'obtenir des connexions du pool et de les gérer (ou de les mal gérer) partout.
Vous pouvez avoir autant d'instances de l'exécuteur que vous le souhaitez, mais personne ne doit écrire de code qui ouvre et ferme les connexions en son propre nom.
De manière pratique, cela vous permet également de consigner tous vos SQL à partir d'un seul ensemble de code.
la source