我正在开发一个连接到 REST 服务、获取响应、对其进行转换并将其写入数据库的服务。我最初在我的概念证明中使用了一个平面文件,并且一切正常。现在,在 10-15 个请求之后,脚本就会挂起。我收到了所有 30 个处理平面文件的请求,而数据库上的请求只有三分之一到一半。
我开始编写一个测试用例来隔离正在发生的事情,并发现在我剥离了所有实际的应用程序逻辑、数据库模式和请求信息之后,我得到了这样的结果:
var mysql = require('mysql');
var pool = mysql.createPool({
host : 'localhost',
user : 'user',
password : 'secret',
});
while (true) {
pool.getConnection(function (err, connection) {
if (err) throw err;
connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
if (err) throw err;
console.log('The solution is: ', rows[0].solution);
connection.end();
});
});
}
据我所知,这是使用连接池做某事的最少代码量。运行时,命令行不会记录任何内容。删除while {}
块,它按预期运行一次然后退出。
我的期望是池大小会提供约束,虽然它会很快查询 mysql,但它永远不会增长到一定大小。相反,它似乎从未尝试建立联系。
根据 Daniel 对异步库和何时调用的评论进行编辑connection.end()
。我遵循异步库在这里实现的逻辑,并且您应该尽早释放资源,但仍有一些东西在阻塞。将查询结果打印到控制台一次,然后“挂起”。
var mysql = require('mysql'),
async = require('async');
var pool = mysql.createPool({
host : 'localhost',
user : 'user',
password : 'secret',
});
async.forever(function() {
pool.getConnection(function (err, connection) {
if(err) throw err;
connection.query('SELECT 1 + 1 AS solution',
function(err, rows, fields) {
connection.end();
if (err) throw err;
console.log('The solution is: ', rows[0].solution);
});
});
},
function (err) {
console.log(err);
});
我不习惯这样被困住——看起来要么async
或者mysql
正在违背异步的承诺……有什么想法吗?