L'exception indique un cas typique de code d'application qui fuit les connexions à la base de données. Vous devez vous assurer que vous acquérez et fermez-les tous (Connection
, Statement
et ResultSet
) dans un try-with-resources
bloc dans le même bloc de méthode selon l'idiome JDBC normal.
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();
}
}
Ou quand vous n'êtes pas sur Java 7, dans un try-finally
bloc. Les fermer en finally
garantira qu'ils sont également fermés en cas d'exceptions.
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) {}
}
}
Oui, vous devez toujours fermer les connexions vous-même, même lorsque vous utilisez le regroupement de connexions. C'est une erreur courante chez les débutants de penser qu'il gérera alors automatiquement la clôture. Ce n'est pas vrai . Le pool de connexions renvoie notamment une connexion encapsulée qui fait quelque chose comme ce qui suit dans le close() :
public void close() throws SQLException {
if (this.connection is still eligible for reuse) {
do not close this.connection, but just return it to pool for reuse;
} else {
actually invoke this.connection.close();
}
}
Si vous ne les fermez pas, la connexion ne sera pas renvoyée au pool pour être réutilisée et, par conséquent, elle en acquerra une nouvelle encore et encore jusqu'à ce que la base de données soit à court de connexions, ce qui entraînera le blocage de votre application.
Voir aussi :
- À quelle fréquence Connection, Statement et ResultSet doivent-ils être fermés dans JDBC ?
- Est-il sûr d'utiliser une instance statique de java.sql.Connection dans un système multithread ?
- Fermeture des connexions JDBC dans le pool