我的问题涉及从节点内发布mysql连接。
如果我在连接发布之前返回,那么该连接是否仍然存在或垃圾收集是否会为我处理?
我问的原因是,我确实遇到了一个问题,后来的连接被拒绝,因为我使用了整个连接池而没有释放它们。
这样做似乎没有出现问题,所以如果可能的话我只想澄清一下。
提前致谢。
捐赠。
sql.getConnection(function (err, connection) {
if (err) {
res.send(4xx,"error");
return;
}
if (req.body.premium) {
//try premium first
//code snipped
return;
}
//code snipped
connection.release();
});
答案 0 :(得分:1)
调用release()
不会破坏连接,它只是将连接标记为“可用”以供其他其他请求使用。因此,如果您没有release()
连接,就连接池而言,它仍然看起来“忙”,这意味着其他请求无法使用它。
答案 1 :(得分:1)
数据库连接甚至不太可能在javascript中进行垃圾收集,因为这需要与JS引擎相当低级别的集成。
除此之外,只要您传递给.getConnection()
的回调尚未被调用,代码中创建的闭包仍然存在,即使您有,也不会对该闭包内的任何变量进行垃圾回收从原始函数调用返回。这是使用异步操作时javascript的一个重要特性,并且在异步编程中被广泛使用。
看起来您有多个代码路径不会释放连接,因为在调用return
之前您有两个connection.release();
语句,所以这两条路径都像我一样通过您的代码,您不会正确释放连接(这与垃圾收集无关)。
如果您未能释放连接,则它将无法在池中使用,并且其他呼叫者无法使用,并且您可能会耗尽池连接。
垃圾收集不会为您解决此问题。您必须确保所有代码路径在完成后释放连接。否则,你会"泄漏"连接和连接池将最终脱离连接。