![](/img/trans.png)
[英]Handshake inactivity timeout: nodejs 6.10.0 mysql pool.queryAsync
[英]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.