2012-11-05 14 views
50
1 S postgres 5038 876 0 80 0 - 11962 sk_wai 09:57 ?  00:00:00 postgres: postgres my_app ::1(45035) idle                     
1 S postgres 9796 876 0 80 0 - 11964 sk_wai 11:01 ?  00:00:00 postgres: postgres my_app ::1(43084) idle    

मैं उनमें से बहुत से देखता हूं। हम अपने कनेक्शन रिसाव को ठीक करने की कोशिश कर रहे हैं। लेकिन इस बीच, हम इन निष्क्रिय कनेक्शनों के लिए टाइमआउट सेट करना चाहते हैं, शायद अधिकतम 5 मिनट तक।निष्क्रिय PostgreSQL कनेक्शन के लिए कोई समय समाप्ति है?

+0

कैसे सेट कर सकते हैं: आप SET आदेश का उपयोग, जैसे यह सेट कर सकते हैं आप डीबी से जुड़ रहे हैं? सॉकेटटाइमआउट आप जो खोज रहे हैं वह हो सकता है। – Doon

+0

हमारे पास यह विरासत पिलोन वेब ऐप है, और हमने स्क्लेक्लेमी का उपयोग किया लेकिन स्पष्ट रूप से हमने इसका सही उपयोग नहीं किया। मुझे याद नहीं है। हम रिसाव को ठीक करने की कोशिश कर रहे हैं। दस्तावेज़ से 'सॉकेटटाइमआउट' ऐसा लगता है कि यह पूरी तरह से डीबी से कनेक्शन बंद कर देता है। मैं प्रत्येक निष्क्रिय को बंद करने की कोशिश कर रहा हूं, और जैसे ही कनेक्शन स्थापित हो जाता है, काउंटर शुरू होता है। – user1012451

+4

देखें http://stackoverflow.com/questions/12391174/is-it-possible-to-configure-postgresql-to-automatically-close-idle-connections – Doon

उत्तर

69

यह आप की तरह लगता है एक कनेक्शन अपने आवेदन में रिसाव क्योंकि यह जमा कनेक्शन बंद करने के लिए विफल रहता है की है। आपको <idle> in transaction सत्रों के साथ समस्याएं नहीं हैं, लेकिन कुल मिलाकर कई कनेक्शन हैं।

हत्या कोड कनेक्शन के लिए सही जवाब नहीं है, लेकिन यह एक ठीक-ठीक अस्थायी कामकाज है।

PostgreSQL डेटाबेस से अन्य सभी कनेक्शन बूट करने के लिए PostgreSQL को फिर से शुरू करने की बजाय, देखें: How do I detach all other users from a postgres database? और How to drop a PostgreSQL database if there are active connections to it?। उत्तरार्द्ध एक बेहतर सवाल दिखाता है।

टाइमआउट सेट करने के लिए, जैसा कि @Doon ने How to close idle connections in PostgreSQL automatically? देखा है, जो आपको पोस्टग्रेएसक्यूएल के लिए प्रॉक्सी में PgBouncer का उपयोग करने और निष्क्रिय कनेक्शन प्रबंधित करने की सलाह देता है। यह एक बहुत अच्छा विचार है यदि आपके पास एक छोटी गाड़ी एप्लिकेशन है जो किसी भी तरह से कनेक्शन को रिसाव करता है; मैं बहुत दृढ़ता से PgBouncer को कॉन्फ़िगर करने की अनुशंसा करता हूं।

TCP keepalive यहां काम नहीं करेगा, क्योंकि ऐप अभी भी जुड़ा हुआ है और जिंदा है, यह सिर्फ नहीं होना चाहिए।

PostgreSQL 9.2 में और ऊपर, आप एक निष्क्रिय कनेक्शन काटनेवाला लागू करने के लिए नई state_change टाइमस्टैम्प स्तंभ और pg_stat_activity की status फ़ील्ड का उपयोग कर सकते हैं।

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 का उपयोग करें।

+0

अच्छा, लेकिन यह अन्य PgAdmin बैकएंड को मार देगा। अतिरिक्त स्थिति का उपयोग करें application_name = '' –

+0

यदि मैं pgbouncer का उपयोग कर रहा हूं तो क्या मैं pg_terminate_backend चला सकता हूं? –

+0

@ हेनलेहीउ मैं नहीं देखता क्यों नहीं, हालांकि मैंने विशेष रूप से जांच नहीं की है। –

15

PostgreSQL 9.1 में, निम्न क्वेरी के साथ निष्क्रिय कनेक्शन। इससे मुझे स्थिति को दूर करने में मदद मिली जो डेटाबेस को पुनरारंभ करने में जरूरी था। यह ज्यादातर जेडीबीसी कनेक्शन खोले जाते हैं और ठीक से बंद नहीं होते हैं।

SELECT 
    pg_terminate_backend(procpid) 
FROM 
    pg_stat_activity 
WHERE 
    current_query = '<IDLE>' 
AND 
    now() - query_start > '00:10:00'; 
+0

pg_terminate_backend 8.4 –

+0

के बाद से मेरा जीवन बचाया !! –

20

PostgreSQL 9.6 में, वहाँ एक नया विकल्प idle_in_transaction_session_timeout जो पूरा करना चाहिए कि तुम क्या वर्णन है।

SET SESSION idle_in_transaction_session_timeout = '5min'; 
+0

यह कुछ आसान पूछने के लिए बेकार है लेकिन मैं सामान्य रूप से डेटाबेस के लिए नया ब्रांड हूं - क्या आप कृपया इस फ़ंक्शन का उपयोग करने के बारे में एक बहुत ही बुनियादी उदाहरण दे सकते हैं? –

+2

कोई समस्या नहीं, उत्तर अद्यतन किया गया। – shosti

+0

PostgreSQL के पिछले संस्करणों में ऐसा कुछ भी ?? – sdsc81

0

अगर आप PostgreSQL 9.6+ उपयोग कर रहे हैं, तो अपने postgresql.conf में आप

idle_in_transaction_session_timeout = 30000(msec)