2017-04-25 50 views
1

为Node.js的MySQL官方NPM包文档(here)使以下建议用于连接到数据库和执行基本查询:NPM mysql模块中的连接方法是否被阻塞?

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 
}); 

在这两种情况下,查询方法connect方法后调用,并不是,正如可以预料的那样,在connect方法的回调中。这似乎意味着连接方法阻塞(即/同步)。

所以我有一个简单的问题,其次是一些更微妙的问题:

是在故宫的mysql模块阻击connect方法?

如果是这样,没有这种违背公约的节点?这个约定是不是会在传递给connect方法的回调中做查询?

最后,如果connect方法阻塞并且违背Node约定,为什么mysql模块的设计者决定阻止connect?这种方法的优点是什么?作为最受欢迎的mysql Node.js包,我确信这种方法被采用是有原因的。

回答

1

问得好!

从文档,我推断你执行所有查询都在内部排队。

当你调用connection.connect(),它会(异步)开始建立与服务器的连接,也将初始化一个查询队列在那里,你想(通过调用connection.query())来运行所有的查询将得到排队。

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

同样的事情也发生与connection.end():它会source)“...发送COM_QUIT包到MySQL服务器之前,请确保还在[执行]所有先前排队的查询”。

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

+0

Thanks @robertklep!这是有道理的,似乎是可能的解释。有人可以授权确认吗? – VKK

+0

您可以随时开始翻翻来源,例如,[这里是'connection.query()'](https://github.com/mysqljs/mysql/blob/f98d2faaf386a646e011da874eb9b2a4a0f1f2e7/lib/Connection.js#L194- L209)。队列[创建并保持在协议驱动程序(https://github.com/mysqljs/mysql/blob/f98d2faaf386a646e011da874eb9b2a4a0f1f2e7/lib/protocol/Protocol.js#L28)。 – robertklep