我正在开发一个连接到 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
or mysql
违反了异步的承诺......有什么想法吗?