Изглежда, че имате изтичане на връзка във вашето приложение, защото не успява да затвори обединени връзки . Нямате проблеми само с <idle> in transaction
сесии, но като цяло с твърде много връзки.
Прекъсването на връзки не е правилният отговор за това, но това е временно решение.
Вместо да рестартирате PostgreSQL, за да стартирате всички други връзки от база данни на PostgreSQL, вижте:Как да отделя всички други потребители от база данни на Postgres? и Как да махна PostgreSQL база данни, ако има активни връзки към нея? . Последният показва по-добра заявка.
За задаване на изчакване, както предложи @Doon, вижте Как автоматично да затваряте неактивни връзки в PostgreSQL?, което ви съветва да използвате PgBouncer за прокси за PostgreSQL и да управлявате неактивни връзки. Това е много добра идея, ако имате бъгаво приложение, което така или иначе пропуска връзки; Аз много силно препоръчваме да конфигурирате PgBouncer.
TCP keepalive няма да свърши работа тук, защото приложението все още е свързано и живо, просто не трябва да бъде.
В 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.