Havuza alınan bağlantıları kapatamadığı için uygulamanızda bir bağlantı sızıntısı var gibi görünüyor . Sadece oturumlarla ilgili değil , genel olarak çok fazla bağlantıyla ilgili sorunlar yaşıyorsunuz .<idle> in transaction
Bağlantıları kesmek bunun için doğru cevap değildir, ancak bu bir OK-ish geçici çözümdür.
Bir PostgreSQL veritabanından diğer tüm bağlantıları başlatmak için PostgreSQL'i yeniden başlatmak yerine, bkz: Diğer tüm kullanıcıları bir postgres veritabanından nasıl ayırabilirim? ve Etkin bağlantılar varsa bir PostgreSQL veritabanı nasıl bırakılır? . İkincisi, daha iyi bir sorgu gösterir.
@Doon'un önerdiği gibi zaman aşımlarını ayarlamak için PostgreSQL'de boşta kalan bağlantılar otomatik olarak nasıl kapatılır? , bu da PostgreSQL için proxy kullanmak ve boş bağlantıları yönetmek için PgBouncer'ı kullanmanızı önerir. Bağlantıları yine de sızdıran hatalı bir uygulamanız varsa bu çok iyi bir fikirdir; Ben çok güçlü bir şekilde pgBouncer yapılandırılması önerilir.
Bir TCP canlı tutma buradaki işi yapmaz, çünkü uygulama hala bağlı ve canlıdır, olmamalı.
PostgreSQL 9.2 ve üzeri sürümlerde, boşta bir bağlantı düzenleyici uygulamak için yeni state_changezaman damgası sütununu ve statealanını pg_stat_activitykullanabilirsiniz. Bir cron işi böyle bir şey çalıştırsın:
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;
Eski sürümlerde, bağlantının ne zaman boşta kaldığını takip eden karmaşık şemalar uygulamanız gerekir. Rahatsız etmeyin; sadece pgbouncer kullanın.