У меня есть Java-программы, которые выдают ошибку после работы в течение нескольких часов ...
IOException: No buffer space available (maximum connections reached?)
Код JDBC, вероятно, неправильно закрывает соединения в блоке finally
try
, где получено соединение. Таким образом, соединения будут оставаться открытыми до тех пор, пока БД не будет принудительно отключена и не закроет их. Время ожидания зависит от используемой конфигурации БД. По-видимому, время ожидания было относительно коротким на предыдущей машине и относительно долгим на новой машине. Когда в БД заканчиваются доступные соединения, потому что ваше приложение никогда не закрывает их, вы получите такое исключение.
В следующих примерах кода показана нормальная (базовая) идиома JDBC для обработки ресурсов (обратите внимание на поток кода и комментарии к коду):
public List<Entity> list() throws SQLException {
// Declare resources.
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
List<Entity> entities = new ArrayList<Entity>();
try {
// Acquire resources.
connection = database.getConnection();
statement = connection.prepareStatement("SELECT id, name, value FROM entity");
resultSet = statement.executeQuery();
// Gather data.
while (resultSet.next()) {
Entity entity = new Entity();
entity.setId(resultSet.getLong("id"));
entity.setName(resultSet.getString("name"));
entity.setValue(resultSet.getInteger("value"));
entities.add(entity);
}
} finally {
// Close resources in reversed order.
if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}
// Return data.
return entities;
}