풀링 된 연결을 닫지 못하기 때문에 응용 프로그램에서 연결 누수 가있는 것 같습니다 . 세션 에만 문제가있는 것이 아니라 전체적으로 너무 많은 연결이 있습니다.<idle> in transaction
연결을 끊는 것은 정답이 아니지만 괜찮은 임시 해결 방법입니다.
PostgreSQL 데이터베이스에서 다른 모든 연결을 부팅하기 위해 PostgreSQL을 다시 시작하는 대신 Postgres 데이터베이스에서 다른 모든 사용자를 분리하려면 어떻게합니까?를 참조하십시오. 그리고 활성 연결이있는 경우 PostgreSQL 데이터베이스를 삭제하는 방법은 무엇입니까? . 후자는 더 나은 쿼리를 보여줍니다.
시간 제한을 설정하려면 @Doon이 제안했듯이 PostgreSQL에서 유휴 연결을 자동으로 닫는 방법을 참조하십시오 . , PgBouncer를 사용하여 PostgreSQL을 프록시하고 유휴 연결을 관리하는 것이 좋습니다. 어쨌든 연결이 누출되는 버그가있는 응용 프로그램이있는 경우 이것은 매우 좋은 생각입니다. 나는 매우 강력 PgBouncer을 구성하는 것이 좋습니다.
TCP의 킵 얼라이브는 응용 프로그램이 여전히 연결되어 살아 있기 때문에, 그냥 안, 여기에 일을하지 않습니다.
PostgreSQL 9.2 이상에서는 새 state_change
타임 스탬프 열과의 state
필드 pg_stat_activity
를 사용하여 유휴 연결 리퍼를 구현할 수 있습니다. 크론 작업을 다음과 같이 실행하십시오.
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를 사용하십시오.