NodeJs+;MySql连接池ER\u等待\u锁定\u超时有时仅限
我面临的是随机的问题,不是每次都会发生。我正在使用nodeJs和连接池。关于连接,我们有连接限制50。这只发生在INSERT上 嵌套查询块是否导致此问题NodeJs+;MySql连接池ER\u等待\u锁定\u超时有时仅限,mysql,node.js,connection-pooling,Mysql,Node.js,Connection Pooling,我面临的是随机的问题,不是每次都会发生。我正在使用nodeJs和连接池。关于连接,我们有连接限制50。这只发生在INSERT上 嵌套查询块是否导致此问题 router.post('/userUpdateProfile', (req, res) => { let selectedSports = [1,2]; mysqlPool = mysql.createPool(mysqlConfig); const sql1 = `call userProfileUpdat
router.post('/userUpdateProfile', (req, res) => {
let selectedSports = [1,2];
mysqlPool = mysql.createPool(mysqlConfig);
const sql1 = `call userProfileUpdate(some params);`;
mysqlPool.query(sql1, [params], (err, response) => {
const sql2 = `call userSportMapDeleteAll(?);`;
mysqlPool.query(sql1, [params], (err1, response1) => {
var sqlBlk = "INSERT INTO UserSportMapping (userId, sportId) VALUES ?";
mysqlPool.query(sqlBlk, [tempSportArray], function(bErr) {
//Here sometimes ER_LOCK_WAIT_TIMEOUT
});
});
})
}
在不释放连接的情况下,您正在打开新的连接。完成操作后,您需要关闭/释放连接 如果这是一个原子过程。将它们一起执行,而不是嵌套 要执行多个语句,请执行以下操作:
var connection = mysql.createConnection({multipleStatements: true});
connection.query('SELECT ?; SELECT ?', [1, 2], function(err, res) {
if (err) throw err;
console.log(res[0]);
console.log(res[1]);
});
用于正确处理连接
编辑:
connection.query('SELECT ?; SELECT ?', [1, 2], function(err, res) {
// connection opened here
......
}); //connection released here
我试过下面的解决方案,它对我有效。感谢@DervişKayımbaşıoğlu告诉我,我的脚本在不等待关闭旧连接的情况下创建了新连接 通过使用getConnection方法。我的问题现在解决了
router.post('/userUpdateProfile', (req, res) => {
let selectedSports = [1,2];
mysqlPool = mysql.createPool(mysqlConfig);
const sql1 = `call userProfileUpdate(some params);`;
mysqlPool.getConnection(function(conErr, connection) {
if(conErr) throw;
connection.query(sql1, [params], (err, response) => {
const sql2 = `call userSportMapDeleteAll(?);`;
connection.query(sql1, [params], (err1, response1) => {
var sqlBlk = "INSERT INTO UserSportMapping (userId, sportId) VALUES ?";
connection.query(sqlBlk, [tempSportArray], function(bErr) {
connection.release();
});
});
})
}):
}
正如文档所说,连接池将自动关闭连接。我们不需要手动释放它。顺便说一句,我将尝试上述方法,看看它是否能解决这个问题。你们这里缺少的是查询块尚未完成。这意味着当您执行其他查询时,连接仍然处于活动状态。因为我正在使用连接池。所以我尝试使用mysqlPool.getConnection方法,并在执行查询块后释放。对于下一个查询,同样的过程。我面临同样的问题issue@PankajCheema请核对我自己的答案