PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Django ORM hinterlässt inaktive Verbindungen in der Postgres-DB

anscheinend trennst du dich nicht. Verwenden von db.close_connection() nach Abfrage beendet würde helfen. Auch wenn ich es richtig verstehe CONN_MAX_AGE zu einem kurzen Wert könnte helfen. Und erwägen Sie die Verwendung eines Sitzungspoolers, z. B. pgbouncer für Django-Verbindungen. Wenn Sie zu viele Verbindungen haben, wird es auf diese Weise warten (oder vorherige wiederverwenden, abhängig von der Konfiguration), anstatt die Ausführung mit einem Fehler abzubrechen ...

aktualisieren :Erklärung, warum ich es vorschlage

aus Dokumenten

Wenn Sie also mehr Threads haben, postgres max_connections , erhalten Sie einen erwähnten Fehler. Jeder Thread kann die Verbindung wiederverwenden, wenn CONN_MAX_AGE nicht bestanden wurde. Ihre Einstellung ist 0, daher sollte die Verbindung nach Abschluss der Abfrage geschlossen werden, aber Sie sehen 100 inaktive Verbindung. Sie schließen also nicht. Die große Anzahl von Verbindungen bedeutet, dass sie auch nicht wiederverwendet werden (Logik:Wenn Sie 100 parallele Abfragen hätten, wären sie nicht alle im Leerlauf, und wenn Sie so viele haben, werden sie nicht wiederverwendet - Eröffnung neu). Ich denke also, dass Django sie nicht wie versprochen schließt - also funktioniert CONN_MAX_AGE auf 0 gesetzt nicht in Ihrem Code. Daher schlage ich vor, db.close_connection() zu verwenden die Trennung zu erzwingen und CONN_MAX_AGE auf einen kleinen Wert zu setzen, kann das Verhalten ändern.