2015-06-19 254 views
0

我正在使用java servlets以及pgadmin 9.1。问题是servlet中的连接没有正确关闭,因此如果达到最大连接,它将导致空白屏幕。我不希望每个用户都在pgadmin中扩展最大连接。 。我已经用下面的查询在开始和结束结束的servlet点,但其示值误差like..connection终止由于管理员命令..如何杀死Postgresql中的空闲连接。

ResultSet rs_1q=st_Query3.executeQuery("SELECT pg_terminate_backend(pg_stat_activity.procpid)FROM pg_stat_activity WHERE pg_stat_activity.current_query = '<IDLE>' AND procpid <> pg_backend_pid();"); 
+1

您应该修复您的servlet并正确关闭所有连接。盲目地杀死所有会议是一件非常可怕的事情。不要与症状作斗争,解决根本原因。 –

回答

2

我不认为杀人的连接是一个理想的解决方案,因为可能是某种可能真正等待交易完成的连接。相反,我会建议你为你的交易设置超时时间。

然而,如果你不顾一切地杀空闲连接,那么你可以尝试这样的:

使用shell脚本,做"ps auxwww|grep 'idle in transaction'" 将返回所有清单“中 交易闲置。”流程。 然后您可以使用“awk”并查找每行输出以获取 进程标识,最后您可以使用"kill <pid>"来标识每个进程。

+0

你能帮我做那件事吗?需要解决这个问题。 – Priya

+0

@Priya: - 您也可以使用[pgbouncer](http://wiki.postgresql.org/wiki/PgBouncer),它将在server_idle_timeout秒后关闭连接。 –

+0

我不想使用单独的脚本来终止连接。我需要在servlet上包含查询。它是一个产品,它不能为每个用户完成。 – Priya

2
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'databasename' AND pid <> pg_backend_pid() AND state in ( 'idle'); 
+4

欢迎来到Stack Overflow!感谢您的代码片段,它可能会提供一些即时的帮助。通过展示*为什么*这是一个很好的解决方案,对未来的读者会有更好的解决方案,这将为它的教育价值提供一个合适的解释[//大大提高](// meta.stackexchange.com/q/114762)但不完全相同的问题。请编辑您的答案以添加解释,并指出适用的限制和假设。 –