Sembra di avere una connessione perdite nell'applicazione perché non riesce a chiudere le connessioni in pool. Non si verificano problemi solo con le sessioni <idle> in transaction
, ma con troppe connessioni in generale.
Le connessioni di uccisione non sono la risposta giusta, ma è una soluzione temporanea OK-ish.
Invece di riavviare PostgreSQL per avviare tutte le altre connessioni da un database PostgreSQL, vedere: How do I detach all other users from a postgres database? e How to drop a PostgreSQL database if there are active connections to it?. Quest'ultimo mostra una query migliore.
Per l'impostazione dei timeout, come suggerito da @Doon, vedere How to close idle connections in PostgreSQL automatically?, che consiglia di utilizzare PgBouncer come proxy per PostgreSQL e gestire le connessioni inattive. Questa è un'ottima idea se hai un'applicazione buggy che perde comunque le connessioni; I molto fortemente consiglia di configurare PgBouncer.
A TCP keepalive non farà il lavoro qui, perché l'app è ancora connessa e viva, semplicemente non dovrebbe essere.
in PostgreSQL 9.2 e versioni successive, è possibile utilizzare la nuova colonna state_change
timestamp e la status
campo della pg_stat_activity
per implementare un mietitore connessione inattiva. Avere un job cron eseguire qualcosa di simile:
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;
Nelle versioni più vecchie è necessario implementare schemi complicati che tengono traccia di quando la connessione è andato inattiva. Non preoccuparti; basta usare pgbouncer.
fonte
2012-11-06 05:37:49
come stai ti connetti al DB? socketTimeout potrebbe essere quello che stai cercando. – Doon
Abbiamo questa web app legacy di Pylons, e abbiamo usato SQLAlchemy ma a quanto pare non l'abbiamo usato correttamente. Non ricordo. Stiamo provando a riparare la perdita. 'socketTimeout' dal documento sembra che questo chiuda completamente la connessione al DB. Sto cercando di chiudere ogni inattività e il contatore si avvia non appena viene stabilita la connessione. – user1012451
vedere http://stackoverflow.com/questions/12391174/is-it-possible-to-configure-postgresql-toautomatically-close-idle-connections – Doon