非阻塞 mysql 客户端实际上是如何工作的?
How non-blocking mysql client actually works?
我最近看到一段如下的 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 协议不允许查询的多路复用,主要是因为当您连接到服务器时,您只占用一个线程,并且在任何给定时间每个线程最多只有一个未完成的查询。因此 MySQL 节点模块通常会为了方便而实现某种队列。
一些 MySQL 模块提供内置连接池,允许您绕过每次连接查询一次的限制,同时保持与服务器的连接数上限 (以免服务器 and/or 运行 超出本地套接字文件描述符)。恕我直言,就并发性而言,池选项最终是最好的解决方案。
非阻塞方面只是意味着您在等待查询完成时不会停止做任何其他事情。这允许您在等待查询的同时做其他事情,例如响应其他 Web 服务器请求、触发计时器等。
我最近看到一段如下的 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 协议不允许查询的多路复用,主要是因为当您连接到服务器时,您只占用一个线程,并且在任何给定时间每个线程最多只有一个未完成的查询。因此 MySQL 节点模块通常会为了方便而实现某种队列。
一些 MySQL 模块提供内置连接池,允许您绕过每次连接查询一次的限制,同时保持与服务器的连接数上限 (以免服务器 and/or 运行 超出本地套接字文件描述符)。恕我直言,就并发性而言,池选项最终是最好的解决方案。
非阻塞方面只是意味着您在等待查询完成时不会停止做任何其他事情。这允许您在等待查询的同时做其他事情,例如响应其他 Web 服务器请求、触发计时器等。