sql >> Databasteknik >  >> RDS >> PostgreSQL

Finns det en timeout för inaktiva PostgreSQL-anslutningar?

Det låter som att du har en anslutningsläcka i ditt program eftersom det misslyckas med att stänga poolade anslutningar . Du har inte bara problem med <idle> in transaction sessioner, men med för många anslutningar totalt sett.

Att döda kontakter är inte det rätta svaret för det, men det är en OK-ish tillfällig lösning.

Istället för att starta om PostgreSQL för att starta alla andra anslutningar från en PostgreSQL-databas, se:Hur kopplar jag bort alla andra användare från en postgres-databas? och Hur släpper man en PostgreSQL-databas om det finns aktiva anslutningar till den? . Den senare visar en bättre fråga.

För att ställa in timeouts, som @Doon föreslog, se Hur stänger man inaktiva anslutningar i PostgreSQL automatiskt?, vilket råder dig att använda PgBouncer för att proxy för PostgreSQL och hantera lediga anslutningar. Detta är en mycket bra idé om du har en buggyapplikation som ändå läcker anslutningar; Jag mycket starkt rekommenderar att du konfigurerar PgBouncer.

En TCP Keepalive kommer inte att göra jobbet här, eftersom appen fortfarande är ansluten och levande, den borde bara inte vara det.

I PostgreSQL 9.2 och senare kan du använda den nya state_change tidsstämpelkolumnen och state fältet pg_stat_activity för att implementera en inaktiv anslutningsreaper. Låt ett cron-jobb köra något så här:

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;

I äldre versioner måste du implementera komplicerade scheman som håller reda på när anslutningen gick inaktiv. Bry dig inte; använd bara pgbouncer.



  1. MariaDB CURRENT_USER() Förklarad

  2. Vilken är standardordningen för en lista som returneras från ett Django-filteranrop?

  3. Hur AUTOINCREMENT fungerar i SQLite

  4. Skapa en Java-applikation i Oracle JDeveloper, del 2