Node.js MySQL如何处理超时和握手不活动超时

时间:2019-09-17 06:26:33

标签: mysql node.js aws-lambda

我是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;
};

而且我是否正在使用最佳方法来连接数据库(如在池中),还是应该仅使用连接等?

1 个答案:

答案 0 :(得分:0)

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