在发布mysql连接之前返回允许通过垃圾回收释放所述连接?

时间:2014-10-06 15:57:41

标签: node.js node-mysql

我的问题涉及从节点内发布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();
    });

2 个答案:

答案 0 :(得分:1)

调用release()不会破坏连接,它只是将连接标记为“可用”以供其他其他请求使用。因此,如果您没有release()连接,就连接池而言,它仍然看起来“忙”,这意味着其他请求无法使用它。

答案 1 :(得分:1)

数据库连接甚至不太可能在javascript中进行垃圾收集,因为这需要与JS引擎相当低级别的集成。

除此之外,只要您传递给.getConnection()的回调尚未被调用,代码中创建的闭包仍然存在,即使您有,也不会对该闭包内的任何变量进行垃圾回收从原始函数调用返回。这是使用异步操作时javascript的一个重要特性,并且在异步编程中被广泛使用。


看起来您有多个代码路径不会释放连接,因为在调用return之前您有两个connection.release();语句,所以这两条路径都像我一样通过您的代码,您不会正确释放连接(这与垃圾收集无关)。

如果您未能释放连接,则它将无法在池中使用,并且其他呼叫者无法使用,并且您可能会耗尽池连接。

垃圾收集不会为您解决此问题。您必须确保所有代码路径在完成后释放连接。否则,你会"泄漏"连接和连接池将最终脱离连接。

相关问题