【问题标题】:Is the connect method in the NPM mysql module blocking?NPM mysql模块中的connect方法是否阻塞?
【发布时间】:2017-04-25 13:59:51
【问题描述】:

Node.js 的官方 mysql NPM 包文档 (here) 对连接数据库和执行基本查询提出以下建议:

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});

connection.connect();

connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});

connection.end();

connect 方法还带有一个可选的回调函数,文档提供了该用法的以下示例(忽略下面示例中的 cmets;此示例实际上是在尝试演示其他内容):

var connection = require('mysql').createConnection({
  port: 84943, // WRONG PORT 
});

connection.connect(function(err) {
  console.log(err.code); // 'ECONNREFUSED' 
  console.log(err.fatal); // true 
});

connection.query('SELECT 1', function (error, results, fields) {
  console.log(error.code); // 'ECONNREFUSED' 
  console.log(error.fatal); // true 
});

在这两种情况下,查询方法是在连接方法之后调用的,而不是,正如预期的那样,在连接方法的回调中。这似乎暗示连接方法是阻塞的(即/同步的)。

所以我有一个简单的问题,然后是一些更细微的问题:

NPM mysql模块中的connect方法是否阻塞?

如果是这样,这不违反 Node 约定吗? 约定不是在传递给 connect 方法的回调中进行查询吗?

最后,如果connect方法是阻塞的并且确实违反了Node约定,为什么mysql模块的设计者决定让connect阻塞呢?这种方法有什么优势?作为最流行的mysql Node.js包,我相信采用这种方法是有原因的。

【问题讨论】:

    标签: mysql node.js node-mysql


    【解决方案1】:

    好问题!

    从文档中我推断您执行的所有查询都在内部排队。

    当您调用connection.connect() 时,它将(异步)开始建立与服务器的连接,并且它还将初始化一个查询队列,您想要运行的所有查询(通过调用connection.query())都会在该队列中获取排队。

    一旦实际连接建立,它将执行排队查询。

    connection.end() 会发生类似的情况:它会“...确保在将 COM_QUIT 数据包发送到 MySQL 服务器之前,所有先前排队的查询仍然 [执行]” (source) .

    因此可能看起来这两种方法都是阻塞(同步)的,但实际上并非如此。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2013-08-17
    • 2013-03-31
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多