2012-03-21 63 views
8

我在PostgreSQL 9.1中使用数据库,其中来自另一个程序的连续入口。我从阿贾克斯6秒后发送请求,以获取最新的entry.tomcat输出窗口显示例外---Arval SQLException:致命:对不起,太多的客户端已经在postgres中

Arval SQLException: FATAL: sorry, too many clients already 

和程序后,这方面的工作也正常。 当我检查我的Postgres与查询---

select count(*) from pg_stat_activity; 

它表明连接正在不断增加,但我关闭每个request.I后的连接正在使用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()); 

//和连接紧密豆的方法是

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

听起来有资源泄漏别的地方。 – 2012-03-22 07:44:06

+1

我想这是一个更具描述性的回答https://stackoverflow.com/a/32584211/1531476 – jANVI 2017-09-15 17:22:28

回答

10

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

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

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

+0

它也取决于资源的处理方式,它很适合使用连接池重用连接。如果每次通话都打开一个新连接,它仍可能导致打开太多的连接。 – 2012-03-21 08:42:17

+0

我正在为每个呼叫建立一个新连接并关闭它,但我认为Postgres不会破坏该连接。我已将连接限制设为100. – 2012-03-21 09:48:32

+0

@vikas malik:我怀疑。请从pg_stat_activity的select *中发布输出;它会显示当前的查询,可以向您提示泄漏发生的位置。 – Jayan 2012-03-21 10:05:06

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

+0

我在我的mac上设置了shared_buffers为10MB – why 2014-05-07 07:21:06

相关问题