【问题标题】:How non-blocking mysql client actually works?非阻塞 mysql 客户端实际上是如何工作的?
【发布时间】:2016-07-19 09:40:40
【问题描述】:

我最近看到一段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服务器端被阻塞?

【问题讨论】:

    标签: mysql node.js nonblocking


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答,只是想确保我做对了。所以基本上mysql服务器只从一个连接顺序执行查询,一些客户端会实现一个队列或一个连接池来跟上这个多查询问题。我发布的代码确实以某种方式解决了这个问题,但是创建一个连接池而不是打开无限连接是一个更好的选择,对吧?
    猜你喜欢
    • 2014-11-26
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2015-05-22
    相关资源
    最近更新 更多