ऐसा लगता है कि आपके आवेदन में कनेक्शन लीक है क्योंकि यह पूल किए गए कनेक्शन को बंद करने में विफल रहता है । आपके पास <idle> in transaction
सत्रों के साथ समस्याएँ नहीं हैं , लेकिन कुल मिलाकर बहुत सारे कनेक्शन हैं।
कनेक्शन को मारना उसके लिए सही उत्तर नहीं है, लेकिन यह एक अस्थायी ईश अस्थायी अस्थायी है।
PostgreSQL डेटाबेस से अन्य सभी कनेक्शनों को बूट करने के लिए PostgreSQL को फिर से शुरू करने के बजाय, देखें: मैं पोस्टग्रेज डेटाबेस से अन्य सभी उपयोगकर्ताओं को कैसे अलग करूं? और कैसे एक 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 का उपयोग करें।