নোডেজ মাইএসকিএল ত্রুটি: সংযোগটি হারিয়েছে সার্ভারটি সংযোগটি বন্ধ করে দিয়েছে


93

যখন আমি নোড মাইএসকিএল ব্যবহার করি, তখন 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();

মনে রাখবেন যে আপনার কোডে আপনি একটি ভুল বার্তা ছিল: if (err.code !== 'PROTOCOL_CONNECTION_LOST') { console.log("PROTOCOL_CONNECTION_LOST"); throw err; }। আপনি চালানো if()ব্লক যদি তা না হয় না PROTOCOL_CONNECTION_LOST এবং এখনো বার্তা এটা যে ত্রুটি ... সম্ভবত খুব বিভ্রান্তিকর বলেছেন।
অ্যালেক্সিস উইলক

উত্তর:


164

সার্ভার সংযোগ বিচ্ছিন্ন করতে এই কোডটি ব্যবহার করার চেষ্টা করুন :

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);


ঠিক আছে, আমি এটি চেষ্টা করব। তবে আমি এই অনুকরণটি কীভাবে অনুকরণ করতে পারি
জ্যাকিলিন

4
কেবলমাত্র একটি পরামর্শ: সবকিছু ঠিকঠাকভাবে কাজ করে তা নিশ্চিত করতে আমি মাইএসকিএল পরিষেবাটি পুনরায় চালু করে পুনরায় সংযোগ পরীক্ষা করছি।
kriskodzi

4
আপনি অবস্থা সিমুলেট করতে @jackieLin, মাইএসকিউএল পরিসেবা পুনরায় আরম্ভ করুন উবুন্টু sudo পরিষেবা মাইএসকিউএল পুনর্সূচনা
igor

4
আপনাকে @ ব্যবহারকারী 3073745 ধন্যবাদ, এই সমস্যাটি পুনরায় চালু করার মাধ্যমে সমাধান করা হয়েছে
জ্যাকিলিন

4
নোড ৮ এর জন্য নিখুঁতভাবে কাজ করে * *, এনপিএম 5.6.0 এবং মাইএসকিএল: 5.7 ... ধন্যবাদ !!
জে রিচার্ডস্জ

47

আমি এই প্রক্রিয়াটির জন্য আমার আসল ব্যবহারের কেসটি স্মরণ করি না। আজকাল, আমি কোনও বৈধ ব্যবহারের ক্ষেত্রে ভাবতে পারি না।

আপনার ক্লায়েন্টটি কখন সংযোগটি হারিয়ে গেছে তা সনাক্ত করতে সক্ষম হবে এবং আপনাকে সংযোগটি পুনরায় তৈরি করার অনুমতি দেবে। যদি এটি গুরুত্বপূর্ণ যে প্রোগ্রাম লজিকের অংশটি একই সংযোগটি ব্যবহার করে কার্যকর করা হয় তবে লেনদেনগুলি ব্যবহার করুন।

tl; dr; এই পদ্ধতিটি ব্যবহার করবেন না।


একটি ব্যবহারিক সমাধান মাইএসকিউএলকে সংযোগটি বাঁচিয়ে রাখতে বাধ্য করা:

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

সংযোগ পুল এবং সংযোগ বিচ্ছিন্ন করার ক্ষেত্রে আমি এই সমাধানটি পছন্দ করি কারণ সংযোগ উপস্থিতি সম্পর্কে সচেতনভাবে এমনভাবে আপনার কোডটি গঠন করার প্রয়োজন হয় না। প্রতি 5 সেকেন্ডে একটি জিজ্ঞাসা করা নিশ্চিত করে যে সংযোগটি জীবিত থাকবে এবং PROTOCOL_CONNECTION_LOSTঘটবে না।

তদুপরি, এই পদ্ধতিটি নিশ্চিত করে যে আপনি পুনরায় সংযোগের বিপরীতে আপনি একই সংযোগটি জীবিত রাখছেন । এটা গুরুত্বপূর্ণ. যদি আপনার স্ক্রিপ্ট নির্ভর করে LAST_INSERT_ID()এবং মাইএসকিএল সংযোগটি সম্পর্কে সচেতন না হয়ে পুনরায় সেট করা হয়ে থাকে তবে কী ঘটবে তা বিবেচনা করুন ?

তবে এটি কেবল নিশ্চিত করে যে সংযোগের সময় শেষ ( wait_timeoutএবং interactive_timeout) ঘটে না। এটি প্রত্যাশার মতো অন্য সমস্ত পরিস্থিতিতে ব্যর্থ হবে। অতএব, অন্যান্য ত্রুটিগুলি পরিচালনা করার বিষয়টি নিশ্চিত করুন।


4
শুধু কৌতূহলী, আপনি কোথায় এই ডিবি কোয়েরি রাখবেন? নোডেজ সার্ভারের নীচে ঠিক আছে? একমাত্র সমস্যাটি হ'ল, আমি কেবল একবার ব্যবহারকারীর প্রমাণীকরণের জন্য মাইএসকিএল ব্যবহার করি এবং তারপরে আমি আমার আরপিজি গেমের জন্য অস্থায়ী ব্যবহারকারীদের উদ্দেশ্যে তাদের ডেটা সংরক্ষণ করি। আমি জানি না কেন আমি আজ এলোমেলোভাবে এই মাইএসকিএল বন্ধ ত্রুটি পেয়েছি, হুম। আমি সংযোগটি সঠিকভাবে বন্ধ করছি, ইত্যাদি etc
NiCk নিউম্যান

4
আপনার ডাটাবেসের সাথে সংযোগ করা উচিত এবং চাহিদা ভিত্তিতে সংযোগ বিচ্ছিন্ন করা উচিত। এই সমাধানটি সেবার জন্য যা অবিচ্ছিন্নভাবে চালিত হয় এবং ডেটাবেস সংযোগটি সর্বদা ব্যবহার করে।
গাজুস

4
আপনার কোড বর্ণিত প্যাটার্ন অনুসরণ করে ( উভয়ই gist.github.com/gajus/5bcd3c7ec5ddcaf53893 এর অনুরূপ ) অনুসারে কোনওটিই সম্ভাব্য শোনায় না । যদি হাজারো প্রশ্নের মধ্যে কেবল একবার বা দু'বার এটি ঘটে থাকে তবে আমি সংযোগের সমস্যা, সার্ভারের ওভারলোড বা lines লাইনগুলি বরাবর কিছু ধরে নেব।
গজুস

4
এটি সম্ভবত সবচেয়ে খারাপ পরামর্শ ছিল! একজন ব্যক্তি পরামর্শ দিচ্ছেন যে আপনার ডাটাবেসগুলিকে ক্যোয়ারী দিয়ে হাতুড়ি দেওয়া উচিত যাতে সংযোগটি ব্যর্থ হয় না? 100 জন এটি করলে কী হয়? বা কেন 10 000 নয়, যদি আপনার অ্যাপ্লিকেশনটি লক্ষণীয় না হয় তবে থ্রেডটি এমআইএসকিউএল থ্রেড পুলটিতে ফিরে দেওয়া উচিত একটি থ্রেড হোগিং নয় যাতে আপনার দুর্বল কোডটি ভেঙে যায় না! এই ক্ষেত্রে আপনি যদি এই জাতীয় ঘটনাটি ঘটে থাকে তবে পুনরায় সংযোগের জন্য কার্যকারিতা প্রয়োগ করেন such ! এটি অবিশ্বাস্য, এটি এমন স্টু *** godশ্বরকে ধন্যবাদ যে এফবি আপনাকে প্রধান স্থপতি হিসাবে দেয়নি !!
প্যাট্রিক ফোরসবার্গ

4
আমি এই পদ্ধতির প্রস্তাব দিই না তা প্রতিবিম্বিত করার জন্য আমার কাছে আপডেট উত্তর রয়েছে। প্যাট্রিককে প্রধান হিসাবে ধন্যবাদ
গজুস


4

ভাল সমাধানটি পুল ব্যবহার করা - আপনার জন্য অসুস্থ এটি পরিচালনা করুন।

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


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। পুল প্রক্রিয়াটি ব্যবহার করে সংযোগের সময়সীমা কীভাবে পরিচালনা করতে হবে তার সমস্ত জটিল বিবরণ গোপন করতে চলেছে। এছাড়াও, node_modules/mysql/Readme.mdমাইএসকিউএল নোড মডিউলটি নিয়ে আসে এমন ফাইলটিতে এটি কীভাবে ব্যবহার করতে হবে সে সম্পর্কে ডকুমেন্টেশন রয়েছে ।
অ্যালেক্সিস উইলক

1

প্রতিটি প্রশ্নের জন্য সংযোগগুলি তৈরি করা এবং ধ্বংস করা জটিল হতে পারে, যখন আমি পরিবর্তে মাইএসকিউএল মারিয়াডিবি ইনস্টল করার সিদ্ধান্ত নিয়েছিলাম তখন একটি সার্ভার মাইগ্রেশন নিয়ে আমার কিছু মাথাব্যথা ছিল। ফাইল ইত্যাদি ক্ষেত্রে / my.cnf প্যারামিটার অপেক্ষা_টাইমআউটটির 10 ডিগ্রিটির একটি ডিফল্ট মান ছিল (এটির কারণে এটি অধ্যবসায় প্রয়োগ করা যায় না)। তারপরে, সমাধানটি ২৮৮০০ সালে সেট করা হয়েছিল, এটি ৮ ঘন্টা। ঠিক আছে, আমি আশা করি এই "জিভেনাডা" দিয়ে কাউকে সাহায্য করবেন ... আমার খারাপ ইংরেজির জন্য আমাকে ক্ষমা করবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.