Het klinkt alsof u een verbindingslek heeft in uw toepassing omdat het niet lukt om gepoolde verbindingen te sluiten . Je hebt niet alleen problemen met <idle> in transaction
sessies, maar met te veel connecties in het algemeen.
Verbindingen uitschakelen is daarvoor niet het juiste antwoord, maar het is een tijdelijke tijdelijke oplossing.
In plaats van PostgreSQL opnieuw te starten om alle andere verbindingen uit een PostgreSQL-database op te starten, raadpleegt u:Hoe koppel ik alle andere gebruikers los van een postgres-database? en Hoe een PostgreSQL-database te laten vallen als er actieve verbindingen mee zijn? . De laatste toont een betere zoekopdracht.
Voor het instellen van time-outs, zoals @Doon suggereerde, zie Hoe inactieve verbindingen in PostgreSQL automatisch te sluiten?, waarin u wordt geadviseerd om PgBouncer te gebruiken om PostgreSQL te proxyen en inactieve verbindingen te beheren. Dit is een heel goed idee als je een toepassing met fouten hebt die toch verbindingen lekt; Ik zeer sterk raad aan om PgBouncer te configureren.
Een TCP-keepalive zal hier niet werken, omdat de app nog steeds verbonden is en actief is, dat zou het gewoon niet moeten zijn.
In PostgreSQL 9.2 en hoger kunt u de nieuwe state_change
. gebruiken tijdstempelkolom en de state
veld van pg_stat_activity
om een inactieve verbindingsreaper te implementeren. Laat een cronjob zoiets als dit uitvoeren:
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;
In oudere versies moet u ingewikkelde schema's implementeren die bijhouden wanneer de verbinding niet actief was. Maak je er niet druk om; gebruik gewoon pgbouncer.