2016-07-31 34 views
3

的问题节点MySQL错误事件触发的连接上已释放回池中

我的问题是,即使我已经从一个请求释放的连接回池中使用。 。 。

connection.release(); 

。 。 。我仍然会在60秒后触发下面的代码并记录一个错误(我假设预定义的超时)。

connection.on('error', function(err) { 
      console.log("Error with connection:" + connection.threadId); 
      return; 
}); 

我敢肯定的连接被释放,因为如果我删除释放线路,并保持发送请求,我可以看到从池中使用不同的连接。同样的连接似乎被使用,如果我把他们进来。

途径编码

app.post('/addImageData', function (req, res) { 
    pool.getConnection(function(err,connection){ 
     if (err) { 
      connection.release(); 
      res.json({"code" : 100, "status" : "Error in connection database"}); 
      return; 
     } 

     writeToDatabaseLog("Image post request made with ID:" + connection.threadId, connection); 

     uploadImageToCloudinary(req.body.image, connection) 
      .then(function(rawData) { 
       return addImageDataToDB(rawData, connection) 
      }).then(function(imageURL) { 
       return notifyIFTTTofImageCapture(imageURL, connection) 
      }).then(function(){ 
       connection.release(); 
       res.send(200); 
      }, function(){ 
       connection.release(); 
       res.send(500); 
      }); 

     connection.on('error', function(err) { 
      console.log("Error with connection:" + connection.threadId); 
      return; 
     }); 
    }); 

}); 

我Bodge修复

我试着读API reference的“池连接”和“错误处理”。

我发现如果我切换三个例子。 。 。

connection.release() 

。 。 。至 。 。 。

connection.destroy() 

。 。 。那么问题不再发生。

我相信这不是最好的解决方案,因为它会从池中删除连接。该API表示将创建一个新的连接,但感觉这会从池中移除。

我想我没有收到

这个问题似乎是,即使连接已返回到池中的事件侦听器的错误仍然有效。但是我不知道如何解决这个问题。

全码:

这是我的全部代码,但不包括上述bodge修复。 https://github.com/tbenyon/suphomie/blob/de855c898065a50c119f66b3773a17012e3c3b8e/app.js

测试

如果你想克隆回购和测试这个现场有一个名为“testDoorBellClient.py”的测试Python文件上这个承诺。

谢谢

这是我的第一个问题,所以如果我错过了什么有用的东西,请让我知道。

感谢您的支持。

回答

1

这很有意义,因为mysql模块不会主动检查(和删除)添加到mysql模块外部的事件处理程序。所以你需要做的是在释放连接之前删除你的处理程序。例如:

connection.removeListener('error', onConnError); 
connection.release(); 

// ... 

function onConnError(err) { 
    console.log("Error with connection:" + connection.threadId); 
} 
connection.on('error', onConnError);