2015-06-19 40 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)但不完全相同的問題。請編輯您的答案以添加解釋,並指出適用的限制和假設。 –