Arval SQLException:致命:对不起,已经有很多客户已经在postgres

时间:2012-03-21 04:43:17

标签: java linux postgresql

我在PostgreSQL 9.1中使用了一个数据库,其中的条目不断来自另一个程序。我在6秒后从Ajax发送请求以获取最新的entry.tomcat输出窗口显示异常---

Arval SQLException: FATAL: sorry, too many clients already

并且程序在此之后也正常工作。   当我用查询---

检查我的postgres
select count(*) from pg_stat_activity;

它表明连接正在不断增加,但我在每次请求后关闭连接。我正在使用netbeans和struts 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());

//连接bean中的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关闭”时打印;

2 个答案:

答案 0 :(得分:19)

要增加连接限制,您可能会喜欢以下文档。

此解决方案在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 size should be less than shmmax size.

<强> 2。检查shmmax的命令:

$ sysctl -e kernel.shmmax
$ ipcs -l

参考:Adjusting shmmax and shmall

第3。增加shmmax的大小:

运行以下命令:

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

并在/etc/sysctl.conf文件中写到:

kernel.shmmax=134217728
kernel.shmall=2097152

参考:SHMMAX in 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

答案 1 :(得分:11)

你可以在postgres中increase the max_connections,但这不是解决方案。你有资源泄漏。它可以是任何 - 连接未关闭,结果集未关闭。请返回并查看代码。

考虑使用像c3p0/BoneCp

这样的连接池库

关于connection pooling is here的一般性讨论 (感谢@ sinisa229 mihajlovski)