最近,我看到了如下所示的一段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服务器端被阻塞?
发布于 2016-03-31 05:38:33
MySQL协议不允许多路复用查询,这主要是因为当您连接到服务器时,您只占用一个线程,而且在任何给定时间,每个线程最多只有一个未完成的查询。因此,为了方便起见,节点的MySQL模块通常会实现某种队列。
一些MySQL模块提供内置的连接池,允许您绕过每个连接的一个查询限制,同时保持与服务器的连接数量上限(以免在本地超过服务器和/或耗尽套接字文件描述符)。最终,IMHO的池选项是并发性的最佳解决方案。
非阻塞方面只意味着在等待查询完成时,您不会停止执行其他任何操作。这允许您在等待查询时执行其他操作,例如响应其他web服务器请求、触发计时器等。
https://stackoverflow.com/questions/36324869
复制相似问题