NodeJs+;MySql连接池ER\u等待\u锁定\u超时有时仅限

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

我面临的是随机的问题,不是每次都会发生。我正在使用nodeJs和连接池。关于连接,我们有连接限制50。这只发生在INSERT上

嵌套查询块是否导致此问题

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请核对我自己的答案