ऐसा लगता है कि आपके पास कनेक्शन लीक है आपके आवेदन में क्योंकि यह पूल किए गए कनेक्शन को बंद करने में विफल रहता है . आपको केवल <idle> in transaction
. के साथ समस्या नहीं हो रही है सत्र, लेकिन कुल मिलाकर बहुत अधिक कनेक्शन के साथ।
किलिंग कनेक्शन उसके लिए सही उत्तर नहीं है, लेकिन यह एक ओके-ईश अस्थायी समाधान है।
PostgreSQL डेटाबेस से अन्य सभी कनेक्शनों को बूट करने के लिए PostgreSQL को फिर से शुरू करने के बजाय, देखें:मैं पोस्टग्रेज़ डेटाबेस से अन्य सभी उपयोगकर्ताओं को कैसे अलग करूं? और अगर इसमें सक्रिय कनेक्शन हैं तो PostgreSQL डेटाबेस को कैसे छोड़ें? . उत्तरार्द्ध एक बेहतर क्वेरी दिखाता है।
टाइमआउट सेट करने के लिए, जैसा कि @Doon ने सुझाव दिया था कि PostgreSQL में निष्क्रिय कनेक्शन को स्वचालित रूप से कैसे बंद करें? , जो आपको PostgreSQL के लिए प्रॉक्सी के लिए PgBouncer का उपयोग करने और निष्क्रिय कनेक्शन प्रबंधित करने की सलाह देता है। यह एक बहुत अच्छा विचार है यदि आपके पास एक बग्गी एप्लिकेशन है जो वैसे भी कनेक्शन लीक करता है; मैं बहुत दृढ़ता से PgBouncer को कॉन्फ़िगर करने की अनुशंसा करें।
टीसीपी कीपलाइव यहां काम नहीं करेगा, क्योंकि ऐप अभी भी जुड़ा हुआ है और जीवित है, ऐसा नहीं होना चाहिए।
PostgreSQL 9.2 और इसके बाद के संस्करण में, आप नए state_change
. का उपयोग कर सकते हैं टाइमस्टैम्प कॉलम और state
pg_stat_activity
. का क्षेत्र एक निष्क्रिय कनेक्शन रीपर को लागू करने के लिए। क्रॉन जॉब कुछ इस तरह चलाएं:
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;
पुराने संस्करणों में आपको जटिल योजनाओं को लागू करने की आवश्यकता होती है जो कनेक्शन के निष्क्रिय होने पर नज़र रखती हैं। ध्यान न देना; बस pgbouncer का उपयोग करें।