Per coloro che sono interessati, ecco la soluzione mi è venuta, ispirato dal commento Craig Ringer s':
(...) utilizzare un job cron a guardare quando la connessione è stata ultima attiva (vedi pg_stat_activity) e utilizzare pg_terminate_backend per uccidere quelli vecchi (...)
La soluzione scelta si riduce in questo modo:.
- Innanzitutto, eseguiamo l'aggiornamento a Postgresql 9.2.
- Quindi, pianifichiamo un thread da eseguire ogni secondo.
- Quando il thread viene eseguito, cerca eventuali vecchie connessioni inattive.
- Una connessione è considerata inattiva se stato è o
idle
, idle in transaction
, idle in transaction (aborted)
o disabled
.
- Una connessione è considerata vecchio se il suo ultimo stato è cambiato per più di 5 minuti.
- Ci sono thread aggiuntivi che fanno lo stesso di sopra. Tuttavia, questi thread si connettono al database con utenti diversi.
- Lasciamo aperta almeno una connessione per qualsiasi applicazione connessa al nostro database. (
rank()
funzione)
Questa è la query SQL gestito dalla discussione:
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
Si potrebbe utilizzare un job cron a guardare quando la connessione precedentemente attivo (vedi 'pg_stat_activity') e l'uso' pg_terminate_backend' per uccidere quelli vecchi. Facilmente espresso in una semplice query. Non sono sicuro che 'pg_terminate_backend' fosse disponibile nella piuttosto antica 8.3, comunque. –