De uitzondering duidt op een typisch geval van toepassingscode die databaseverbindingen lekt. U moet ervoor zorgen dat u en . verwerft sluit ze allemaal (Connection
, Statement
en ResultSet
) in een try-with-resources
blok in dezelfde methode blok volgens het normale JDBC-idioom.
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();
}
}
Of als je niet op Java 7 zit, in een try-finally
blok. Ze sluiten in finally
zal garanderen dat ze ook gesloten zijn in geval van uitzonderingen.
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) {}
}
}
Ja, je moet nog steeds zelf verbindingen afsluiten, ook als je gebruikmaakt van pooling van verbindingen. Het is een veelgemaakte fout onder starters dat ze denken dat het dan automatisch de afsluiting afhandelt. Dit is niet waar . De verbindingspool retourneert namelijk een ingepakte verbinding die zoiets als het volgende doet in de 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();
}
}
Als u ze niet sluit, wordt de verbinding niet vrijgegeven aan de pool voor hergebruik en krijgt deze dus steeds weer een nieuwe totdat de DB geen verbindingen meer heeft, waardoor uw toepassing vastloopt.
Zie ook:
- Hoe vaak moeten Connection, Statement en ResultSet worden gesloten in JDBC?
- Is het veilig om een statische java.sql.Connection-instantie te gebruiken in een multithreaded systeem?
- JDBC-verbindingen in pool sluiten