Исключение указывает на типичный случай кода приложения, который пропускает соединения с базой данных. Вам необходимо убедиться, что вы приобрели и , чтобы закрыть их все (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();
}
}
Не закрытие их приведет к тому, что соединение не будет возвращено обратно в пул для повторного использования, и, таким образом, оно будет снова и снова приобретать новое, пока в БД не закончатся соединения, что приведет к сбою приложения.
Смотри также: