我有一个脚本,其中包含从postgresql数据库获取数据并将其返回给客户端的rest apis。在开始时,脚本仅使用大约7mb的内存,并且在进行查询时响应时间非常快。但是,随着时间的推移(大约1天),脚本使用的内存会增加到170mb。现在,查询需要1分钟以上才能响应。但是当我重新启动脚本时,它的响应现在又快了。我无知为何会发生这种情况。任何人都可以对此有所了解吗?以下是我的脚本的一部分:
var port = process.env.PORT || 8000;
var router = express.Router();
router.get('/:id/from/:prevdate', function (req, res) {
var results = [];
var id = req.params.id;
var prevdate = req.params.prevdate;
pg.connect(connectionString, function (err, client, done) {
var query = client.query("some sql statement here", [id, prevdate]);
query.on('row', function (row) {
results.push(row);
});
query.on('end', function () {
client.end();
return res.json(results);
});
if (err) {
console.log(err);
}
});
});
router.get('/:id/getdata', function (req, res) {
var results = [];
var id = req.params.id;
pg.connect(connectionString, function (err, client, done) {
var query = client.query("some sql statement here", [id]);
query.on('row', function (row) {
results.push(row);
});
query.on('end', function () {
client.end();
return res.json(results);
});
if (err) {
console.log(err);
}
});
});
app.use('/restapitest', router);
app.listen(port);
console.log('Webservice started using port: ' + port);
答案 0 :(得分:0)
您正在混合connection pooling(使用done()
)与创建single connections(使用client.end()
)。
试试这个:
query.on('end', function() {
done();
return res.json(results);
});
此外,由于您无论如何都要将所有结果存储在内存中,因此无需使用事件。因此,通过适当的错误和连接处理,您可以使用:
pg.connect(connectionString, function (err, client, done) {
var sendError = function(err) {
console.log(err);
return res.sendStatus(500);
};
if (err) return sendError(err);
client.query("some sql statement here", [id, prevdate], function(err, results) {
// Done with the client.
done();
// Handle any errors.
if (err) return sendError(err);
// Return result
return res.json(results);
});
});