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 我检查了。在当前查询字段中,条目是以上是关于Arval SQLException: FATAL: 抱歉,postgres 中已经有太多客户端的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLException: SQL 语句在 org.hsqldb.jdbc.JDBCUtil.sqlException 处关闭
SQLException.getSQLState 的所有可能值是啥?
java.sql.SQLException:getShort() 的值无效 - ''
Cause: java.sql.SQLException: 请求的转换无效 ; uncategorized SQLException for SQL []; SQL state [99999]; er