非阻塞的mysql客户端实际上是如何工作的?

时间:2016-03-31 05:28:55

标签: mysql node.js nonblocking

我最近看到了一段如下所示的node.js代码,它应该作为独立服务运行,而不是每次收到新请求时都重新启动:

switch(action) {
    case 'a':
        connectMysql(function(mysqlConnection) {
            // some queries X
        });
        break;
    case 'b':
        connectMysql(function(mysqlConnection) {
            // some queries Y
        });
        break;
    /***** more actions *****/
}

每次为每个动作打开一个新的MySQL连接,而写这个动作的人认为这种方法可以确保查询并行执行,并且当有一个巨大的时候不会阻止对方请求金额在同一时间。

这让我很困惑,因为我认为node.js的mysql客户端是非阻塞的,它不会阻止任何东西。

如果查询被卡住的可能性很大,原因可能是进程处理的请求过多,而且更多的mysql连接肯定不会有帮助。

或者,非阻塞客户端只是意味着它将异步发送查询,但是当查询过多时,查询最终会在mysql服务器端被阻止?

1 个答案:

答案 0 :(得分:1)

MySQL协议不允许多路查询查询,因为当您连接到服务器时,您只占用一个线程,并且在任何给定时间每个线程最多只有一个未完成查询。因此,节点的MySQL模块通常会实现某种排队方式。

某些MySQL模块提供内置连接池,允许您解决每个连接一次查询的限制,同时保持服务器连接数的上限(以免压倒服务器和/或本地用完套接字文件描述符)。恕我直言最终,汇集选项是并发性的最佳解决方案。

非阻塞方面只是意味着您在等待查询完成时不会停止执行任何其他操作。这允许您在等待查询时执行其他操作,例如响应其他Web服务器请求,触发计时器等。