【问题标题】:Nodejs mysql how to handle timeout and Handshake inactivity timeoutNodejs mysql如何处理超时和握手不活动超时
【发布时间】:2019-09-17 06:26:33
【问题描述】:

我是 Nodejs 的新手,我有一个在 NodeJS 上编写的 lambda 函数,它应该删除一些行并在 mysql db 上插入一些数据。 我遇到过各种带有错误消息的实例,例如 PROTOCOL_SEQUENCE_TIMEOUT、PROTOCOL_CONNECTION_LOST 以及无法解析 RDS db 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;
};

而且我是在使用连接到数据库的最佳方法,就像在池中一样,还是应该只使用连接等?

【问题讨论】:

  • 根据您最近的几篇帖子,您似乎在使用新的堆栈方面取得了良好的进展。您选择使用的架构的每个元素都为出错提供了独特的机会,因此您的设置和整体方法的额外背景可能会有所帮助。例如:您的 RDS 实例的具体情况是什么,values 平均创建了多少条记录,同时发生了哪些其他并发操作,还有哪些其他文件支持这些活动(它们是如何触发的)。这些错误不是 MySQL 协议的一部分

标签: mysql node.js aws-lambda


【解决方案1】:

您可以缓存连接,因此对 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 块中进行连接重试。

【讨论】:

    猜你喜欢
    • 2017-08-03
    • 2021-04-19
    • 2017-04-22
    • 2020-04-11
    • 2016-06-03
    • 1970-01-01
    • 2016-08-18
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多