NPM mysql模块中的连接方法是否被阻塞?
Node.js( 这里 )的官方mysql NPM包文档提供了连接数据库和执行基本查询的以下build议:
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方法也采用一个可选的callback函数,文档中提供了下面这个用法的例子(忽略下面例子中的注释;这个例子实际上是试图演示别的):
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 });
在这两种情况下,查询方法都是在connect方法之后调用的,而不是像connect所期望的那样在connect方法的callback中调用。 这似乎意味着连接方法阻塞(即/同步)。
所以我有一个简单的问题,然后是一些更细微的问题:
NPM mysql模块中的connect
方法是否被阻塞?
如果是这样,这是否违背了Node约定? 约定是不是会在传递给connect
方法的callback中进行查询?
最后,如果connect方法阻塞,并且违背Node约定,为什么mysql模块的devise者决定做connect
阻塞? 这种方法的优点是什么? 作为最受欢迎的mysql Node.js包,我敢肯定这个方法是有原因的。
好问题!
从文档中我推断你执行的所有查询都在内部排队。
当你调用connection.connect()
,它将(asynchronous)开始build立到服务器的连接,并且它还会初始化一个查询队列,你想运行的所有查询(通过调用connection.query()
)将会排队等候
一旦build立了实际连接,它将执行排队查询。
类似的情况发生在connection.end()
:它将“…确保所有以前排队的查询仍然[执行]在发送一个COM_QUIT包到MySQL服务器” ( 源 )。
所以它可能看起来像两个方法阻塞(同步),但实际上他们不是。