Эта ошибка связана с ОС или базой данных? - PullRequest
0 голосов
/ 11 октября 2010

У меня есть Java-программы, которые выдают ошибку после работы в течение нескольких часов. Эти программы раньше нормально работали на нашем более раннем сервере, на котором был Windows Server 2003, теперь мы обновились до Windows Server 2008 с более высокой конфигурацией и недавно установленный SQL Server. Есть ли какие-либо настройки БД, которые мне не хватает, или есть какие-либо настройки ОС, которые я пропустил ??

ИСКЛЮЧЕНИЕ, которое я получаю:

Error ::

org.apache.commons.dbcp.SQLNestedException: не удалось создать PoolableConnectionFactory, причина: ошибка сети

IOException: Недоступно буферного пространства (достигнуто максимальное количество соединений?): Connect

Ответы [ 3 ]

1 голос
/ 13 января 2011

У меня возникла похожая проблема в Windows, и мне пришлось внести изменения в реестр.Это было связано с тем, что сокеты открывались и закрывались с высокой скоростью, быстрее, чем они очищались ОС.

Я не могу вспомнить конкретный параметр реестра, но он увеличивает количество подключений сокетов илидоступны для пользовательских приложений.

Если я правильно помню, по умолчанию в ОС установлено 5000 соединений.

0 голосов
/ 11 октября 2010

У меня есть 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;
}
0 голосов
/ 11 октября 2010

Используйте другой пакет пула соединений с БД, например c3p0.также проверьте его совместимость с драйвером JDBC.

...