Es klingt wie Sie haben eine Verbindung in Ihrer Anwendung auslaufen, weil es nicht gepoolten Verbindungen zu schließen. Sie haben keine Probleme nur mit <idle> in transaction
Sitzungen, aber mit zu vielen Verbindungen insgesamt.
Töten von Verbindungen ist nicht die richtige Antwort dafür, aber es ist eine OK-ish temporäre Problemumgehung.
Anstatt PostgreSQL neu zu starten, um alle anderen Verbindungen von einer PostgreSQL-Datenbank zu starten, siehe: How do I detach all other users from a postgres database? und How to drop a PostgreSQL database if there are active connections to it?. Letzteres zeigt eine bessere Abfrage.
Zum Festlegen von Zeitüberschreitungen, wie von @Doon empfohlen, siehe How to close idle connections in PostgreSQL automatically?, in der Sie aufgefordert werden, PgBouncer für die Verwendung von PostgreSQL zu verwenden und Verbindungen im Leerlauf zu verwalten. Dies ist eine sehr gute Idee, wenn Sie eine fehlerhafte Anwendung haben, die Verbindungen trotzdem verliert. I sehr stark empfehlen, PgBouncer zu konfigurieren.
Ein TCP keepalive wird hier nicht funktionieren, weil die App immer noch verbunden und am Leben ist, sollte es einfach nicht sein.
In PostgreSQL 9.2 und höher, können Sie die neue state_change
Timestamp-Spalte und das status
Feld pg_stat_activity
verwenden, um eine Verbindung im Leerlauf Reaper zu implementieren. Haben Sie einen cron-Job etwas wie folgt aus:
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 älteren Versionen müssen Sie komplizierte Systeme implementieren, die verfolgen, wenn die Verbindung ging im Leerlauf. Mach dir keine Sorgen. benutze einfach pgbouncer.
wie einstellen sind Du verbindest dich mit der DB? socketTimeout könnte das sein, was Sie suchen. – Doon
Wir haben diese Legacy Pylons Web App, und wir haben SQLAlchemy verwendet, aber anscheinend haben wir es nicht richtig benutzt. Ich erinnere mich nicht. Wir versuchen, das Leck zu beheben. 'socketTimeout' von dem Dokument, das so aussieht, schließt die Verbindung zur DB vollständig. Ich versuche, jeden Leerlauf zu schließen, und der Zähler startet, sobald die Verbindung hergestellt ist. – user1012451
siehe http://stackoverflow.com/questions/12391174/is-it-possible-to-configure-postgresql-to-automatisch-close-idle-connections – Doon