1 S postgres 5038 876 0 80 0 - 11962 sk_wai 09:57 ? 00:00:00 postgres: postgres my_app ::1(45035) idle
1 S postgres 9796 876 0 80 0 - 11964 sk_wai 11:01 ? 00:00:00 postgres: postgres my_app ::1(43084) idle
Ich sehe viele von ihnen. Wir versuchen, unser Verbindungsleck zu beheben. In der Zwischenzeit möchten wir eine Zeitüberschreitung für diese Leerlaufverbindungen festlegen, möglicherweise maximal 5 Minuten.
postgresql
database-connection
user1012451
quelle
quelle
socketTimeout
Aus dem Dokument geht hervor, dass die Verbindung zur Datenbank vollständig geschlossen wird. Ich versuche, jeden Leerlauf zu schließen, und der Zähler startet, sobald die Verbindung hergestellt ist.<IDLE> in transaction
Sitzungen zu beenden und die Sitzung laufen zu lassen, aber im<IDLE>
Status? Mit anderen Worten, die Transaktion beenden, aber nicht die Sitzung? (Abgestimmt: unklare Frage)idle
für immer sehen, fragen wir, ob wir für jede Verbindung / Sitzung eine Zeitüberschreitung festlegen könnten (ich kenne ehrlich gesagt nicht die richtige Terminologie, sorry). Wenn eine Transaktion für eine normale Web-App 5 Minuten dauert, muss etwas falsch sein ....Antworten:
Es hört sich so an, als hätten Sie ein Verbindungsleck in Ihrer Anwendung, weil gepoolte Verbindungen nicht geschlossen werden können . Sie haben nicht nur Probleme mit
<idle> in transaction
Sitzungen, sondern insgesamt mit zu vielen Verbindungen.Das Beenden von Verbindungen ist nicht die richtige Antwort darauf, aber es ist eine vorübergehende Problemumgehung.
Anstatt PostgreSQL neu zu starten, um alle anderen Verbindungen von einer PostgreSQL-Datenbank zu starten, lesen Sie: Wie trenne ich alle anderen Benutzer von einer Postgres-Datenbank? und Wie lösche ich eine PostgreSQL-Datenbank, wenn aktive Verbindungen zu ihr bestehen? . Letzteres zeigt eine bessere Abfrage.
Informationen zum Festlegen von Zeitüberschreitungen, wie von @Doon vorgeschlagen, finden Sie unter So schließen Sie inaktive Verbindungen in PostgreSQL automatisch. Hiermit wird empfohlen, PgBouncer als Proxy für PostgreSQL zu verwenden und inaktive Verbindungen zu verwalten. Dies ist eine sehr gute Idee, wenn Sie eine fehlerhafte Anwendung haben, die ohnehin Verbindungen verliert. Ich empfehle dringend , PgBouncer zu konfigurieren.
Ein TCP-Keepalive erledigt den Job hier nicht, da die App noch verbunden und lebendig ist, sollte es einfach nicht sein.
In PostgreSQL 9.2 und höher können Sie die neue
state_change
Zeitstempelspalte und dasstate
Feld von verwendenpg_stat_activity
, um einen Reaper für Leerlaufverbindungen zu implementieren. Lassen Sie einen Cron-Job so etwas ausführen:In älteren Versionen müssen Sie komplizierte Schemata implementieren, die verfolgen, wann die Verbindung unterbrochen wurde. Kümmern Sie sich nicht; benutze einfach pgbouncer.
quelle
idle
. Warum sollte ich es schließen?In PostgreSQL 9.6 gibt es eine neue Option,
idle_in_transaction_session_timeout
die das erreichen soll, was Sie beschreiben. Sie können es mit demSET
Befehl einstellen , zB:quelle
SET SESSION
ist nur für die aktuelle Sitzung vorgesehen (sobald Sie eine neue Verbindung herstellen, wird die Standardeinstellung wiederhergestellt). Sie können Konfigurationsparameter auch auf Datenbankebene festlegen, indem Sie z. B.ALTER DATABASE SET idle_in_transaction_session_timeout = '5min'
oder Konfigurationsdateien verwenden (siehe postgresql.org/docs/current/static/config-setting.html ).In PostgreSQL 9.1 werden die inaktiven Verbindungen mit der folgenden Abfrage ausgeführt. Es hat mir geholfen, die Situation abzuwehren, die einen Neustart der Datenbank rechtfertigte. Dies geschieht meistens, wenn JDBC-Verbindungen geöffnet und nicht ordnungsgemäß geschlossen werden.
quelle
Wenn Sie postgresql 9.6+ verwenden, können Sie dies in Ihrer postgresql.conf festlegen
idle_in_transaction_session_timeout = 30000
(ms)quelle
Eine mögliche Problemumgehung, mit der das Zeitlimit für Datenbanksitzungen ohne eine externe geplante Aufgabe aktiviert werden kann , ist die Verwendung der von mir entwickelten Erweiterung pg_timeout .
quelle