プールされた接続を閉じることができないため、アプリケーションで接続リークが発生しているようです。セッションだけで問題が発生しているわけではありませんが、全体的に接続が多すぎます。<idle> in transaction
接続を切断することはそのための正しい答えではありませんが、それはOKっぽい一時的な回避策です。
PostgreSQLを再起動してPostgreSQLデータベースから他のすべての接続を起動するのではなく、「postgresデータベースから他のすべてのユーザーを切り離すにはどうすればよいですか?」を参照してください。PostgreSQLデータベースへのアクティブな接続がある場合にPostgreSQLデータベースを削除するにはどうすればよいですか?。後者はより良いクエリを示しています。
タイムアウトの設定については、@ Doonが提案したように、PostgreSQLでアイドル状態の接続を自動的に閉じる方法を参照してください。、PgBouncerを使用してPostgreSQLのプロキシを作成し、アイドル状態の接続を管理することをお勧めします。とにかく接続をリークするバグのあるアプリケーションがある場合、これは非常に良い考えです。PgBouncerを構成することを強くお勧めします。
TCPキープアライブはここでは機能しません。アプリはまだ接続されており、生きているため、接続されるべきではありません。
PostgreSQL 9.2以降では、新しいstate_change
タイムスタンプ列とのstate
フィールドを使用pg_stat_activity
して、アイドル状態の接続リーパーを実装できます。cronジョブに次のようなものを実行させます。
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'regress'
AND pid <> pg_backend_pid()
AND state = 'idle'
AND state_change < current_timestamp - INTERVAL '5' MINUTE;
古いバージョンでは、接続がアイドル状態になったときを追跡する複雑なスキームを実装する必要があります。邪魔しないで; pgbouncerを使用するだけです。