NPM mysql 模块中的连接方法是否阻塞?
Is the connect method in the NPM mysql module blocking?
Node.js (here) 的官方 mysql NPM 包文档对连接到数据库和执行基本查询提出了以下建议:
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
});
在这两种情况下,查询方法都在连接方法之后调用,而不是,正如预期的那样,在连接方法的回调中。这似乎暗示连接方法是阻塞的(即/同步)。
所以我有一个简单的问题,然后是一些更细微的问题:
NPMmysql模块中的connect
方法是否阻塞?
如果是这样,这不是违反了 Node 约定吗?约定不是在传递给 connect
方法的回调中进行查询吗? ?
最后,如果 connect 方法是阻塞的并且确实违反了 Node 约定,为什么 mysql 模块的设计者决定 connect
阻塞?这种方法有什么优点? 作为最受欢迎的 mysql Node.js 软件包,我确信采用这种方法是有原因的。
问得好!
根据文档,我推断您执行的所有查询都在内部排队。
当您调用 connection.connect()
时,它会(异步地)开始建立与服务器的连接,并且还会初始化一个查询队列,您想要 运行(通过调用 connection.query()
) 将排队。
建立实际连接后,它将执行排队的查询。
类似的事情发生在 connection.end()
上:它将 "...确保所有先前排队的查询在发送 COM_QUIT 数据包到 MySQL 服务器 (source).
所以它可能看起来两种方法都是阻塞的(同步的),但实际上它们不是。
Node.js (here) 的官方 mysql NPM 包文档对连接到数据库和执行基本查询提出了以下建议:
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
});
在这两种情况下,查询方法都在连接方法之后调用,而不是,正如预期的那样,在连接方法的回调中。这似乎暗示连接方法是阻塞的(即/同步)。
所以我有一个简单的问题,然后是一些更细微的问题:
NPMmysql模块中的connect
方法是否阻塞?
如果是这样,这不是违反了 Node 约定吗?约定不是在传递给 connect
方法的回调中进行查询吗? ?
最后,如果 connect 方法是阻塞的并且确实违反了 Node 约定,为什么 mysql 模块的设计者决定 connect
阻塞?这种方法有什么优点? 作为最受欢迎的 mysql Node.js 软件包,我确信采用这种方法是有原因的。
问得好!
根据文档,我推断您执行的所有查询都在内部排队。
当您调用 connection.connect()
时,它会(异步地)开始建立与服务器的连接,并且还会初始化一个查询队列,您想要 运行(通过调用 connection.query()
) 将排队。
建立实际连接后,它将执行排队的查询。
类似的事情发生在 connection.end()
上:它将 "...确保所有先前排队的查询在发送 COM_QUIT 数据包到 MySQL 服务器 (source).
所以它可能看起来两种方法都是阻塞的(同步的),但实际上它们不是。