2011-11-09 18 views
6

मैं निम्नलिखित के रूप में मेरे रेल अनुप्रयोग के सेटअप:रेल पैदा करता है: कुछ समय समाप्ति के बाद "PGError सर्वर कनेक्शन अप्रत्याशित रूप से बंद"

  • रेल: 3.0.5 (अपाचे प्रॉक्सी के तहत) RHEL पर चल 5.6
  • पोस्टग्रेज़: 8.4, विंडोज सर्वर 2008 पर चल रहा है 2 सर्वर एक ही लैन पर हैं।

समस्या है, कुछ निष्क्रिय समय के बाद, जब मैं रेल अनुप्रयोग के लिए एक नया अनुरोध कर, यह मेरे निम्न त्रुटि देता है:

ActiveRecord::StatementInvalid (PGError: server closed the connection unexpectedly 
    This probably means the server terminated abnormally 
    before or while processing the request. 

मैं क्या शोध किया है से, ऐसा लगता है कि Postgres द्वारा कुछ समय समाप्ति के बाद डेटाबेस कनेक्शन गिराए गए हैं। इस समय के दौरान, रेल की ओर,

  • से अगर मैं रेल के लिए एक अनुरोध (1 अनुरोध), यह ऊपर
  • के रूप में कनेक्शन त्रुटि प्रदर्शित करेगा अगर मैं रेल के लिए एक और अनुरोध (2 अनुरोध) बनाने बनाने के लिए, रेल पोस्टग्रेज़ से फिर से जुड़ने लगते हैं और सही तरीके से काम करते हैं।

इसका मतलब है कि मुझे हमेशा पहली कनेक्शन त्रुटि का अनुभव होगा, फिर मेरे पास सामान्य ऑपरेशन होगा, जो मेरे मामले में बहुत गंभीर है क्योंकि मैं अपने क्लाइंट को एक गैर-त्रुटि प्रतिक्रिया देना चाहता हूं।

मैं सवाल और जवाब निम्नलिखित में देखा है, लेकिन वे मेरे मामले के लिए उपयुक्त होने के लिए नहीं है:

क्या आपके एप को डीबी कनेक्शन त्रुटियों से मुक्त करने के लिए कोई सलाह है? धन्यवाद।

+0

मुझे heroku – Salil

+0

के साथ postgresql का उपयोग करते समय एक ही त्रुटि मिल रही है कनेक्शन के लिए जाना सामान्य है। रेलों के लिए यह बहुत ही अनुचित तरीके से इलाज करना सामान्य नहीं है। 'सत्यापित करें' और 'सक्रिय? 'के अपने डेटाबेस ड्राइवर (एडाप्टर) के कार्यान्वयन की जांच करें; आम तौर पर 'ActiveRecord :: कनेक्शनएडाप्टर :: कनेक्शनपूल' एडाप्टर को पूल से बाहर निकलने से पहले किसी भी पुराने कनेक्शन को फिर से कनेक्ट करने का मौका देता है। पोस्टग्रेस के लिए आप किस मणि का उपयोग कर रहे हैं? – vladr

उत्तर

1

डेटाबेस.इमल में, क्या आपके पास कनेक्शन के लिए reconnect: true विकल्प सेट है? पूर्व:

production: 
    adapter: postgresql 
    database: myapp 
    username: deploy 
    password: password 
    reconnect: true 

मैं विशिष्ट त्रुटि के बारे में निश्चित नहीं हूँ, लेकिन इस विकल्प के बिना आप की उम्मीद db खुद त्रुटियों के एक वर्ग को संभालने की जरूरत है।

4

हमें हेरोकू पर बहुत समस्या थी, बहुत कुछ। एक हैकिश समाधान के रूप में, हमने यहां किया है। अपने ApplicationController में निम्नलिखित रखो:

prepend_before_filter :confirm_connection 
def confirm_connection 
    c = ActiveRecord::Base.connection 
    begin 
    c.select_all "SELECT 1" 
    rescue ActiveRecord::StatementInvalid 
    ActiveRecord::Base.logger.warn "Reconnecting to database" 
    c.reconnect! 
    end 
end 

मूल रूप से, प्रत्येक नियंत्रक हिट पर कनेक्शन परीक्षण करती है। स्केलेबल? ज़रुरी नहीं। लेकिन यह हमारे लिए समस्या तय की।