नोडज mysql त्रुटि: कनेक्शन खो गया सर्वर ने कनेक्शन बंद कर दिया


89

जब मैं नोड mysql का उपयोग करता हूं, तो 12:00 से 2:00 के बीच एक त्रुटि दिखाई देती है कि टीसीपी कनेक्शन सर्वर द्वारा बंद है। यह पूरा संदेश है:

Error: Connection lost: The server closed the connection.
at Protocol.end (/opt/node-v0.10.20-linux-x64/IM/node_modules/mysql/lib/protocol/Protocol.js:73:13)
at Socket.onend (stream.js:79:10)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:920:16
at process._tickCallback (node.js:415:13)

नहीं है समाधान । हालाँकि, मैं इस तरह से प्रयास करने के बाद, समस्या भी दिखाई देती है। अब मुझे नहीं पता कि मुझे कैसे करना है। क्या कोई इस समस्या को पूरा करता है?

यहाँ मैंने लिखा है कि समाधान का पालन करें:

    var handleKFDisconnect = function() {
    kfdb.on('error', function(err) {
        if (!err.fatal) {
            return;
        }
        if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
            console.log("PROTOCOL_CONNECTION_LOST");
            throw err;
        }
        log.error("The database is error:" + err.stack);

        kfdb = mysql.createConnection(kf_config);

        console.log("kfid");

        console.log(kfdb);
        handleKFDisconnect();
    });
   };
   handleKFDisconnect();

जवाबों:


160

सर्वर डिस्कनेक्ट को संभालने के लिए इस कोड का उपयोग करने का प्रयास करें :

var db_config = {
  host: 'localhost',
    user: 'root',
    password: '',
    database: 'example'
};

var connection;

function handleDisconnect() {
  connection = mysql.createConnection(db_config); // Recreate the connection, since
                                                  // the old one cannot be reused.

  connection.connect(function(err) {              // The server is either down
    if(err) {                                     // or restarting (takes a while sometimes).
      console.log('error when connecting to db:', err);
      setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect,
    }                                     // to avoid a hot loop, and to allow our node script to
  });                                     // process asynchronous requests in the meantime.
                                          // If you're also serving http, display a 503 error.
  connection.on('error', function(err) {
    console.log('db error', err);
    if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
      handleDisconnect();                         // lost due to either server restart, or a
    } else {                                      // connnection idle timeout (the wait_timeout
      throw err;                                  // server variable configures this)
    }
  });
}

handleDisconnect();

आपके कोड में मैं भागों को याद कर रहा हूं connection = mysql.createConnection(db_config);


ठीक है, मैं यह कोशिश करूँगा। लेकिन मैं इस निरूपण का अनुकरण कैसे कर सकता हूं
जैकीलेन

1
बस एक टिप: मैं सब कुछ अच्छी तरह से काम करता है यह सुनिश्चित करने के लिए mysql सेवा को पुनरारंभ करके पुन: कनेक्ट कर रहा हूं।
kriskodzi

2
@jackieLin आप स्थिति को अनुकरण कर सकते हैं, mysql सेवा को पुनः आरंभ कर, ubuntu sudo सेवा पर mysql पुनरारंभ
igor

1
आपको धन्यवाद @ user3073745, यह समस्या पुनरारंभ द्वारा हल की गई है
jackieLin

1
नोड 8. *, npm 5.6.0 और mysql: 5.7 के लिए पूरी तरह से काम करता है ... धन्यवाद !!
जेचर्ड्सज

47

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

आपके ग्राहक को यह पता लगाने में सक्षम होना चाहिए कि कनेक्शन कब खो गया है और आपको कनेक्शन फिर से बनाने की अनुमति देता है। यदि यह महत्वपूर्ण है कि प्रोग्राम लॉजिक का हिस्सा उसी कनेक्शन का उपयोग करके निष्पादित किया जाता है, तो लेनदेन का उपयोग करें।

tl; डॉ; इस विधि का उपयोग न करें।


कनेक्शन को जीवित रखने के लिए MySQL को बाध्य करने के लिए एक व्यावहारिक समाधान है:

setInterval(function () {
    db.query('SELECT 1');
}, 5000);

मैं कनेक्शन पूल और हैंडल डिस्कनेक्ट करने के लिए इस समाधान को पसंद करता हूं क्योंकि यह आपके कोड को एक तरह से संरचना करने की आवश्यकता नहीं है जो कनेक्शन की उपस्थिति से अवगत है। प्रत्येक 5 सेकंड में एक क्वेरी करना सुनिश्चित करता है कि कनेक्शन जीवित रहेगा और PROTOCOL_CONNECTION_LOSTघटित नहीं होता है।

इसके अलावा, यह विधि सुनिश्चित करती है कि आप उसी कनेक्शन को जीवित रख रहे हैं , जैसा कि फिर से जोड़ने का विरोध है। यह महत्वपूर्ण है। इस बात पर विचार करें कि यदि आपकी स्क्रिप्ट पर भरोसा किया जाता है LAST_INSERT_ID()और आपके बारे में जागरूक हुए बिना मेरा कनेक्शन रीसेट कर दिया गया तो क्या होगा ?

हालांकि, यह केवल यह सुनिश्चित करता है कि कनेक्शन टाइम आउट ( wait_timeoutऔर interactive_timeout) नहीं होता है। यह, जैसा कि अपेक्षित है, अन्य सभी स्थितियों में विफल रहेगा। इसलिए, अन्य त्रुटियों को संभालना सुनिश्चित करें।


1
बस जिज्ञासु, तुम उस db क्वेरी को कहाँ पर रखोगे? नोडज सर्वर के निचले भाग में सही है? एकमात्र मुद्दा यह है कि, मैं केवल एक बार उपयोगकर्ता को प्रमाणित करने के लिए mysql का उपयोग करता हूं, और फिर मैं अपने आरपीजी गेम के लिए एक अस्थायी उपयोगकर्ता ऑब्जेक्ट में उनके डेटा को संग्रहीत करता हूं। मुझे नहीं पता कि मुझे यह mysql बंद त्रुटि आज अनियमित रूप से क्यों मिली, हम्म। मैं ठीक से कनेक्शन बंद कर रहा हूं, आदि भी।
नीके न्यूमैन

1
आपको डेटाबेस से कनेक्ट करना चाहिए और मांग के आधार पर डिस्कनेक्ट करना चाहिए। यह समाधान उन सेवाओं के लिए है जो हर समय निरंतर चलती हैं और डेटाबेस कनेक्शन का उपयोग करती हैं।
गजस

1
न तो यह लगता है कि आपका कोड वर्णित पैटर्न का अनुसरण करता है ( gist.github.com/gajus/5bcd3c7ec5ddcaf53893 के समान )। यदि यह हजारों प्रश्नों में से केवल एक या दो बार हुआ, तो मैं कनेक्टिविटी मुद्दों, सर्वर अधिभार, या उन पंक्तियों के साथ कुछ ग्रहण करूंगा।
गजस

2
यह संभवतः सबसे खराब सुझाव था! एक व्यक्ति का सुझाव है कि आपको डेटाबेस को प्रश्नों के साथ हथौड़ा देना चाहिए ताकि कनेक्शन न चले? अगर 100 लोग ऐसा करते हैं तो क्या होता है? या क्यों नहीं 10 000, यदि आपका ऐप नोटिंग नहीं करता है, तो थ्रेड को MYSQL थ्रेड पूल में नहीं लौटाया जाना चाहिए, ताकि थ्रेड हॉगिंग न हो, ताकि आपका कमज़ोर कोड न टूटे!, इस मामले में अगर आपने इस तरह की घटना को फिर से जोड़ने के लिए कार्यक्षमता को लागू किया है तो! ! यह अविश्वसनीय है, यह इस तरह के एक स्टु *** भगवान का शुक्र है कि एफबी ने आपको मुख्य वास्तुकार के रूप में नहीं किया है !!
पैट्रिक फोर्स्बर्ग

2
मैंने उत्तर दिया है कि मैं इस दृष्टिकोण की सिफारिश नहीं करता हूं। पैट्रिक के सिर के लिए धन्यवाद।
गजस


3

बेहतर उपाय यह है कि आप पूल का उपयोग करें - यह आपके लिए है।

const pool = mysql.createPool({
  host: 'localhost',
  user: '--',
  database: '---',
  password: '----'
});

// ... later
pool.query('select 1 + 1', (err, rows) => { /* */ });

https://github.com/sidorares/node-mysql2/issues/836


1

प्रत्येक क्वेरी में कनेक्शन बनाना और नष्ट करना शायद जटिल है, जब मैं MySQL के बजाय मारबीडीबी स्थापित करने का निर्णय ले रहा था, तो मुझे सर्वर माइग्रेशन के साथ कुछ सिरदर्द थे। फ़ाइल आदि / my.cnf में किसी कारण के लिए पैरामीटर प्रतीक्षा_ टाइमआउट में 10 सेकंड का डिफ़ॉल्ट मान था (यह कारण है कि दृढ़ता को लागू नहीं किया जा सकता है)। फिर, समाधान इसे 28800 में सेट किया गया, यह 8 घंटे है। खैर, मुझे आशा है कि इस "गुंडेनाडा" के साथ किसी को मदद मिलेगी ... मेरी बुरी अंग्रेजी के लिए मुझे माफ करना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.