प्रिय स्टैकओवरफ्लोर्स :)
मैं अपना पहला एमवीसी एप्लिकेशन नोड.जेएस पर बना रहा हूं और मुझे ऐसी समस्या है:
कभी-कभी, जब मैं लंबे समय तक (लगभग 3 मिनट) डेटाबेस से कोई प्रश्न नहीं करता और एक करने का प्रयास करता हूं, तो मुझे ऐसी त्रुटि होती है: "यह सॉकेट दूसरी पार्टी द्वारा समाप्त कर दिया गया है"
मुझे पता चला, कि यह mysql config में Wait_timeout विकल्प के कारण है, जो डाउनटाइम मान से अधिक होने पर कनेक्शन बंद कर देता है
तो क्या मैं सही हूं कि मुझे डेटाबेस से प्रत्येक क्वेरी से पहले खुले रहने के लिए कनेक्शन की जांच करनी चाहिए? और अगर मुझे चाहिए, कैसे और कहाँ?
यह मेरी डीबी कनेक्शन फ़ाइल है:

const mysql = require('mysql2');

// create the connection to database
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'mysql',
    password: 'mysql',
    database: 'qa'
});

exports.connect = (done) => {
    connection.connect((err) =>{
        if(err){
            console.log('db connection error');
        }
        else{
            done()
        }
   })
}

exports.connection = connection;

और यह मेरे मॉडल में से एक का हिस्सा है:

const db = require('../db');
exports.makeNewQuestion = async (topic, text, subsection, user) => {
    return db.connection.promise().execute("INSERT INTO `questions` (`topic`, `text`, 
    `subsection_id`, `user_id`) VALUES (?, ?, ?, ?)", [topic, text, subsection, user]);
}
0
Pariah 28 अप्रैल 2020, 02:18

2 जवाब

क्वेरी (या कनेक्शन निर्माण) की त्रुटि को पकड़ने और संभालने का सबसे अच्छा तरीका होगा।

connection.query(
  'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
  ['Page', 45],
  function(err, results) {
    if (err) {
      // handle error here
      return; // prevent continue of function;
    }
    // use the results
    console.log(results);
  }
);

यह नोड-mysql2 के रचनाकारों द्वारा भी इच्छित तरीका है, क्योंकि यह नोड-mysql के मानक पर निर्मित है (प्रोजेक्ट दस्तावेज़ देखें) जो उपयोगकर्ताओं के लिए उनके इच्छित त्रुटि प्रबंधन को निर्दिष्ट करता है यहां.

वास्तविक क्वेरी से पहले एक खुले कनेक्शन की जाँच करने से क्वेरी प्रक्रिया के लिए बहुत अधिक ओवरहेड बनता है और सब कुछ धीमा हो जाता है। इसके अलावा: ऐसा करना वास्तव में उतना विश्वसनीय नहीं है, क्योंकि कनेक्शन सैद्धांतिक रूप से समय समाप्त हो सकता है या बंद हो सकता है अन्यथा ठीक है जब चेक किया गया था और इसकी पुष्टि वापस आ रही है।

0
Niklas E. 28 अप्रैल 2020, 02:40

जहां तक ​​​​मुझे पता है कि कनेक्शन की जांच करने के लिए आपको किसी मौजूदा तालिका की क्वेरी की आवश्यकता नहीं है/आप कुछ इस तरह उपयोग कर सकते हैं:

select 1

अगर वह काम करता है तो आप जुड़े हुए हैं।

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

0
Jac 28 अप्रैल 2020, 02:51