Les pools de connexions visent à améliorer les performances des applications en réutilisant les connexions aux bases de données, évitant ainsi la surcharge liée à l'établissement de nouvelles connexions à chaque fois. Cependant, lorsque les connexions à la base de données ne sont pas correctement gérées, cela peut entraîner l'épuisement du pool de connexions.
Une application Java-JSF est confrontée à un épuisement du pool de connexions en raison de mauvaise gestion des connexions. L'application récupère les connexions d'un pool de connexions géré par le serveur d'applications GlassFish. Après des opérations approfondies sur la base de données, l'application rencontre l'erreur suivante :
RAR5117 : Failed to obtain/create connection from connection pool [ mysql_testPool ]. Reason : In-use connections equal max-pool-size and expired max-wait-time. Cannot allocate more connections.
La cause première de l'épuisement du pool de connexions est la fuite de connexion à la base de données. Les connexions ne sont pas correctement fermées après utilisation, entraînant leur maintien indéfini dans la piscine. Chaque connexion non fermée consomme un emplacement dans le pool, ce qui finit par l'épuiser et empêche l'application d'acquérir des connexions supplémentaires.
Pour résoudre l'épuisement du pool de connexions, il est crucial de assurer la bonne gestion des connexions aux bases de données. Ceci peut être réalisé en utilisant un bloc try-with-resources pour acquérir et fermer les connexions au sein du même bloc de méthode, garantissant que les connexions sont toujours fermées, même en présence d'exceptions.
public void create(Entity entity) throws SQLException { try ( Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_CREATE); ) { statement.setSomeObject(1, entity.getSomeProperty()); // ... statement.executeUpdate(); } }
Alternativement, si vous utilisez Java 7 ou une version antérieure, les blocs try-finally peuvent être employés :
public void create(Entity entity) throws SQLException { Connection connection = null; PreparedStatement statement = null; try { connection = dataSource.getConnection(); statement = connection.prepareStatement(SQL_CREATE); statement.setSomeObject(1, entity.getSomeProperty()); // ... statement.executeUpdate(); } finally { if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} } }
Il est essentiel de comprendre que même lors de l'utilisation de pools de connexions, il est de la responsabilité du développeur d'applications de fermer manuellement les connexions. Les pools de connexions ne gèrent pas automatiquement les fermetures de connexion. Au lieu de cela, ils utilisent généralement une approche de connexion encapsulée, dans laquelle la méthode connection close() vérifie si la connexion peut être réutilisée avant de la fermer réellement.
Par conséquent, négliger de fermer les connexions peut entraîner une accumulation de connexions inutilisées. au sein du pool, entraînant son épuisement et les plantages ultérieurs des applications. Une gestion appropriée des connexions est cruciale pour maintenir la santé et l’efficacité des pools de connexions JDBC.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!