Изключението показва типичен случай на код на приложение, който пропуска връзки към базата данни. Трябва да сте сигурни, че придобиватеи затворете всички от тях (Connection
, Statement
и ResultSet
) в try-with-resources
блок в същия метод блок според нормалния 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();
}
}
Или когато не сте на Java 7, в try-finally
блок. Затварянето им в finally
ще гарантира, че те също ще бъдат затворени в случай на изключения.
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) {}
}
}
Да, все още трябва сами да затваряте връзки, дори когато използвате пул на връзки. Често срещана грешка сред стартиращите е, че смятат, че след това автоматично ще се справи със затварянето. Товане е вярно . Пулът за връзки именно връща обвита връзка, която прави нещо като следното в 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();
}
}
Ако не ги затворите, връзката няма да бъде освободена обратно в пула за повторна употреба и по този начин тя ще придобива нова отново и отново, докато DB изчерпи връзките, което ще доведе до срив на приложението ви.
Вижте също:
- Колко често трябва да се затварят Connection, Statement и ResultSet в JDBC?
- Безопасно ли е да се използва статичен екземпляр java.sql.Connection в многонишкова система?
- Затваряне на JDBC връзки в пул