Arval SQLException: FATAL: 抱歉,postgres 中已经有太多客户端

Posted

技术标签:

【中文标题】Arval SQLException: FATAL: 抱歉,postgres 中已经有太多客户端【英文标题】:Arval SQLException: FATAL: sorry, too many clients already in postgres 【发布时间】:2012-04-05 14:56:43 【问题描述】:

我在 PostgreSQL 9.1 中使用一个数据库,其中的条目不断来自另一个程序。我在 6 秒后从 Ajax 发送请求以获取最新条目。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 关闭”时打印;

【问题讨论】:

好像在其他地方有资源泄漏。 我想这是一个更具描述性的答案***.com/a/32584211/1531476 【参考方案1】:

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

此解决方案在 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

【讨论】:

我在我的 mac 上将 shared_buffers 设置为 10MB【参考方案2】:

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

考虑使用像c3p0/BoneCp这样的连接池库

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

【讨论】:

这也取决于处理资源的方式,最好使用连接池来重用连接。如果每次调用都打开一个新连接,它仍然会导致打开太多连接。 我正在为每个呼叫建立一个新连接并关闭它,但我认为 Postgres 不会破坏该连接。我已将连接限制设置为 100。 @vikas malik:我怀疑。请从 pg_stat_activity 中发布 select * 的输出;它将显示当前查询,可以提示您发生泄漏的位置。 Jayan 我检查了。在当前查询字段中,条目是 99 次。在 99 连接之前它不会显示错误,但在此之后它会显示错误。 6 秒后,pg_stat_activity 中有一个新条目。 @vikasmalik。请在问题中添加相关代码。我们使用 postgresql ,我相信它没有小错误。

以上是关于Arval SQLException: FATAL: 抱歉,postgres 中已经有太多客户端的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException: SQL 语句在 org.hsqldb.jdbc.JDBCUtil.sqlException 处关闭

异常和 SQLException 的区别

SQLException: 游标状态无效

SQLException.getSQLState 的所有可能值是啥?

java.sql.SQLException:getShort() 的值无效 - ''

Cause: java.sql.SQLException: 请求的转换无效 ; uncategorized SQLException for SQL []; SQL state [99999]; er