7

के लिए फेलओवर पर रेल पोस्टग्रेज़ पुन: कनेक्शन, मेरे पास बहु-एज़ आर्किटेक्चर के साथ एडब्लूएस आरडीएस के तहत पोस्टग्रेस डेटाबेस के साथ एक रेल एप्लिकेशन है। आरडीएस द्वारा उपयोग किया गया एचए आर्किटेक्चर मास्टर/गुलाम है और वे एक ही एंडपॉइंट के साथ सेवा प्रदान करते हैं जो वर्तमान मास्टर को इंगित करता है।आरडीएस

जब भी कोई डेटाबेस विफलता हो, तो सक्रिय रिकॉर्ड मास्टर के लिए नया आईपी लेने के लिए कनेक्शन को पुनः प्रयास करने के बजाय, उसी सर्वर से कनेक्ट करने का प्रयास जारी रखेगा।

ActiveRecord::StatementInvalid: PG::ConnectionBad: PQsocket() can't get socket descriptor त्रुटि के लिए "वैश्विक" बचाव बनाने का कोई तरीका है जो आसानी से ActiveRecord::Base.connection_pool.disconnect! चलाता है जो अगली क्वेरी को काम करने के लिए करेगा?

उत्तर

2

मैं postgres_adapter पर बंदर पैच लगाने के द्वारा विफलता ईवेंट के बाद सक्रिय रिकॉर्ड पुनः कनेक्ट करने में सक्षम था।

lib/core_ext/active_record/postgresql_adapter.rb:

require 'active_record/connection_adapters/postgresql_adapter' 

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter 
    private 
    def exec_no_cache(sql, name, binds) 
    log(sql, name, binds) { @connection.async_exec(sql, []) } 
    rescue ActiveRecord::StatementInvalid => e 
    if e.to_s.include?('PG::ConnectionBad') 
     ActiveRecord::Base.connection_pool.disconnect! 
    end 
    raise e 
    end 
end 
संबंधित मुद्दे