sql >> Databáze >  >> RDS >> PostgreSQL

Jak automaticky zavřít nečinná připojení v PostgreSQL?

Pro ty, které to zajímá, zde je řešení, se kterým jsem přišel, inspirovaný komentářem Craiga Ringera:

(...) pomocí úlohy cron se podívejte, kdy bylo připojení naposledy aktivní (viz pg_stat_activity) a použijte pg_terminate_backend k zabití starých.(...)

Zvolené řešení vypadá takto:

  • Nejprve upgradujeme na Postgresql 9.2.
  • Potom naplánujeme spuštění vlákna každou sekundu.
  • Když vlákno běží, hledá všechna stará neaktivní připojení.
    • Připojení je považováno za neaktivní pokud je jeho stav je buď idle , idle in transaction , idle in transaction (aborted) nebo disabled .
    • Připojení je považováno za staré pokud je jeho stav zůstal stejný po dobu více než 5 minut.
  • Existují další vlákna, která fungují stejně jako výše. Tato vlákna se však připojují k databázi s jiným uživatelem.
  • Pro každou aplikaci připojenou k naší databázi necháme otevřené alespoň jedno připojení. (rank() funkce)

Toto je dotaz SQL spuštěný vláknem:

WITH inactive_connections AS (
    SELECT
        pid,
        rank() over (partition by client_addr order by backend_start ASC) as rank
    FROM 
        pg_stat_activity
    WHERE
        -- Exclude the thread owned connection (ie no auto-kill)
        pid <> pg_backend_pid( )
    AND
        -- Exclude known applications connections
        application_name !~ '(?:psql)|(?:pgAdmin.+)'
    AND
        -- Include connections to the same database the thread is connected to
        datname = current_database() 
    AND
        -- Include connections using the same thread username connection
        usename = current_user 
    AND
        -- Include inactive connections only
        state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled') 
    AND
        -- Include old connections (found with the state_change field)
        current_timestamp - state_change > interval '5 minutes' 
)
SELECT
    pg_terminate_backend(pid)
FROM
    inactive_connections 
WHERE
    rank > 1 -- Leave one connection for each application connected to the database


  1. Nasazení vysoce dostupného Nextcloudu s MySQL Galera Cluster a GlusterFS

  2. Jak funguje WEIGHT_STRING() v MariaDB

  3. MAX vs Top 1 – co je lepší?

  4. Optimalizace dotazů v PostgreSQL. Základy VYSVĚTLENÍ – 2. část