Arval SQLException: FATAL: извините, слишком много клиентов уже в postgres - PullRequest
8 голосов
/ 21 марта 2012

Я использую базу данных в PostgreSQL 9.1, в которую постоянно поступают записи из другой программы. Я отправляю запрос от Ajax через 6 секунд, чтобы получить последнее окно ввода entry.tomcat показывает исключение ---

Arval SQLException: FATAL: sorry, too many clients already

и программа работает правильно и после этого. Когда я проверяю свои postgres с запросом ---

select count(*) from pg_stat_activity;

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

     long previousSNO = Long.parseLong(request.getParameter("previousSNO"));
    if(previousSNO == 0)
    {
        sb.append("SELECT sno,search_type,search_value,search_date FROM log_temp ORDER BY search_date DESC LIMIT 20");
        prest = cb.executeSQLQuery(sb.toString());
        rs = prest.executeQuery();
    }
    else
    {
        sb.append("SELECT sno,search_type,search_value,search_date FROM log_temp WHERE sno > ? ORDER BY search_date DESC");
        prest = cb.executeSQLQuery(sb.toString());    
        prest.setLong(1, previousSNO);
        rs = prest.executeQuery();
    }
    rs.last();
    int c = rs.getRow();
    rs.beforeFirst();

    if(rs!=null && c>0)
    {    
    //code for making json resultsb from resultset here    
    rs.close();
    }
    cb.closeConnection();
    response.setContentType("text/plain");
    response.getWriter().print(resultsb.toString());

// и метод close в компоненте соединения равен

    public void closeConnection() {
    try {
        // st.close();
        conn.close();
        System.out.println("con is closed");
        conn = null;

    } catch (SQLException e) {
        e.getMessage();
        System.out.println(e.getMessage());
        System.out.println("con is not closed");
    }
}

Каждый раз, когда его вывод на консоль "con is closed";

Ответы [ 2 ]

19 голосов
/ 07 января 2013

Для увеличения лимита подключения вам может понравиться следующий документ.

Это решение протестировано на Ubuntu 12.04.

1. Внесите следующие изменения в файл postgresql.conf:

Открыть /etc/postgresql/9.1/main/postgresql.conf

max_connections = 200
shared_buffers = 100MB
max_files_per_process = 100

Ссылка: размер shared_buffers должен быть меньше размера shmmax.

2. Команды для проверки shmmax:

$ sysctl -e kernel.shmmax
$ ipcs -l

Ссылка: Настройка shmmax и shmall

3. Увеличьте размер shmmax:

Запустите следующую команду:

$ sysctl -w kernel.shmmax=134217728
$ sysctl -w kernel.shmall=2097152

и напишите сверху в /etc/sysctl.conf файле:

kernel.shmmax=134217728
kernel.shmall=2097152

Ссылка: SHMMAX в Ubuntu

4. Перезапустите postgresql

$ service postgresql restart

Ссылки:

http://www.varlena.com/GeneralBits/Tidbits/perf.html

http://www.postgresql.org/docs/9.1/static/runtime-config-resource.html

11 голосов
/ 21 марта 2012

Вы можете увеличить max_connections в postgres, но это не решение проблемы.У вас есть утечки ресурсов.Может быть любым - соединение не закрыто, набор результатов не закрыт.Пожалуйста вернитесь и проверьте код.

Рассмотрите возможность использования библиотеки пулов соединений, например c3p0 / BoneCp

Общее обсуждение пулов соединений здесь (Спасибо @ sinisa229 mihajlovski)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...