2015-08-23 47 views
1

我有一个脚本,其余的apis从postgresql数据库获取数据并将其返回给客户端。在开始时,脚本只使用大约7mb的内存,并且在进行查询时响应时间非常快。但是,随着时间的推移(大约1天),脚本使用的内存会增加到170mb。而现在,查询需要超过1分钟的时间才能做出回应。但是,当我重新启动脚本时,它的响应速度又很快。我无能为力,为什么会发生这种情况。任何人都可以阐明这一点吗?以下是对我的脚本看起来像一个部分:与创建single connectionsrest api使用express.js和posgresql

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

你混合connection pooling(使用done())(使用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); 
    }); 
}); 
+0

将尝试此并更新任何结果..谢谢@robertklep – overmind