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

标签 mysql node.js node-mysql

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 方法也有一个可选的回调函数,文档提供了以下用法示例(忽略下面示例中的注释;该示例实际上是在尝试演示其他内容):

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 包,我确信采用这种方法是有原因的。

最佳答案

好问题!

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

当您调用 connection.connect() 时,它将(异步地)开始设置与服务器的连接,并且还将初始化一个查询队列,其中包含您要运行的所有查询(通过调用 connection.query())将排队。

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

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

所以它可能看起来两个方法都是阻塞的(同步的),但实际上它们不是。

关于mysql - NPM mysql模块中的connect方法是否阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43612820/

相关文章:

javascript - 在 node.js mysql 查询中,检查是否没有找到匹配项

mysql - 从 NodeJS (Express App) 连接到 MySQL 会抛出错误

php - MySQL 上的多个 INSERT/UPDATE

mysql - SQL 分组依据不工作。

php - 使用 PHP 将注册商标符号/版权符号插入 MySQL

javascript - 在 node.js 中,什么时候使用事件,什么时候使用直接回调函数?

node.js - sails.js 服务中的水线错误实现

字符串中的 MySQL 文本列

javascript - 记录js文件名和函数名

javascript - 为什么从导入的文件中看不到该变量?