簡體   English   中英

Node.js MySQL如何處理超時和握手不活動超時

[英]Nodejs mysql how to handle timeout and Handshake inactivity timeout

我是Nodejs的新手,我在NodeJS上編寫了一個lambda函數,該函數應該刪除一些行並在mysql db上插入一些數據。 我遇到了各種帶有錯誤消息的實例,例如PROTOCOL_SEQUENCE_TIMEOUT,PROTOCOL_CONNECTION_LOST,以及一個RDS數據庫dns無法解析並連接到數據庫的實例。

我想知道如何處理這些事件,以便能夠重新連接並繼續進行。

var mysql = require('mysql');

var pool = mysql.createPool({
  host     : 'somehost',
  user     : 'someuser',
  password : 'somepassword',
  database : 'somedb',
  port : 3306
});

pool.on('connection', function (connection) {
  console.log('Pool id %d connected', connection.threadId);
});

pool.on('enqueue', function () {
  console.log('Waiting for available connection slot');
});


exports.handler = async (event, context) => {
    context.callbackWaitsForEmptyEventLoop = false;
    let request = JSON.parse(event.body);

    /** SOME OTHER LOGIC HERE **/

    let delete_query = "DELETE FROM answers WHERE sId= ? AND `key` = ?";
    pool.query(delete_query, [sId, questionId], function(err, result){
        if(err) throw err;
    });

    let insert_query = "INSERT INTO answers (qId, sId, `key`, value, hutk) VALUES ?";
    pool.query(insert_query, [values], function(err, result){
        if(err) throw err;
        console.log("Successfull Insert")
    });

    const response = {
        statusCode: 200,
        headers: {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Credentials': true
        },
        body: JSON.stringify({message : 'success'}),
    };
    return response;
};

而且我是否在使用最佳方法來連接數據庫(如在池中),還是應該僅使用連接等?

您可以緩存連接,因此第一次調用lambda將創建連接,而第二次調用(如果lambda不是冷啟動的)可以重用該連接,並且速度更快。

這是我們的方法:

  const mysql = require('mysql');
const util = require('util');

let mySQLconnection = undefined;

exports.handler = async function handler(event, context) {
    try {
        getMySQLConnection();
        const queryResult = await mySQLconnection.query('Select * from yourtable where id = ? and attribute = ?', [id, attribute]);
    } catch (error) {
        console.log('ERROR: ' + error);
    }
};

function getMySQLConnection() {
    if (mySQLconnection !== undefined) {
        return;
    }
    mySQLconnection = mysql.createConnection(yourConnectionJson);
    mySQLconnection.query = util.promisify(mySQLconnection.query);
}

您還可以在catch塊中進行連接重試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM