Výjimka označuje typický případ kódu aplikace, při kterém dochází k úniku databázových připojení. Musíte zajistit, že získáte a zavřete je všechny (Connection
, Statement
a ResultSet
) v try-with-resources
blok ve stejném bloku metody podle normálního idiomu JDBC.
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();
}
}
Nebo když nepoužíváte Java 7, v try-finally
blok. Zavřete je v finally
zaručí, že budou uzavřeny i v případě výjimek.
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) {}
}
}
Ano, stále musíte uzavřít připojení sami, i když používáte sdružování připojení. Mezi začátečníky je běžnou chybou, že si myslí, že to pak automaticky zvládne zavření. To není pravda . Fond připojení konkrétně vrací zabalené připojení, které v close():
dělá něco jako následující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();
}
}
Pokud je neuzavřete, spojení nebude uvolněno zpět do fondu pro opětovné použití, a proto bude znovu a znovu získávat nové, dokud DB nedojde připojení, což způsobí pád vaší aplikace.
Viz také:
- Jak často by měly být v JDBC uzavřeny Connection, Statement a ResultSet?
- Je bezpečné používat statickou instanci java.sql.Connection ve vícevláknovém systému?
- Uzavření připojení JDBC ve fondu