0

这是我正在使用的请求示例:

app.get('/', function (req, res) {
     var user_hash = req.cookies.SESSION;

    db.connect(mongoURI, function (err, db) {
        var collection = db.collection('sessions');

        collection.findOne({hash: user_hash}, function (err, item) {
            res.render('index', {title: 'Домашняя страница', session: item !== null});
            db.close();
        });
    });
});

我有很多这样的请求。

当我使用以下命令对 Apache Benchmark 进行基准测试时,就会出现问题:

ab -n 100 -c100 http://127.0.0.1:8080

我收到以下错误:

cannon read property collection of null

我的猜测是,在 apache 基准测试之后,在 mongodb 上打开的连接数为 130 - 150。现在我正试图在将我的服务器投入“战斗”之前让它更稳定。我听说过连接池,但无法弄清楚。

现在的问题是:我的服务器崩溃是因为“在 mongodb 上打开了许多连接”还是其他原因?我应该怎么做才能修复它?

4

1 回答 1

1

不断打开和关闭与后端数据库的连接不是一个好习惯,因为资源返回到操作系统需要一些时间。这可能解释了您看到错误的原因。

您可以按照此处所述增加 mongod 或 mongos 的 ulimit ,但鉴于您尝试进行的测试类型,我仍然认为您会用完资源。

使用mongoose之类的东西或此处描述的方法可能对您更有意义。

但是如果你真的想遵循你当前的方法,你应该包装你的快速应用程序:

Db.connect(mongoURI,function(err, db){
  if(err) {
    console.log("Error " , err);
    return;
  }
  var collection = db.collection('sessions');

  app.get('/', function (req, res) {
    var user_hash = req.cookies.SESSION;
    collection.findOne({hash: user_hash}, function (err, item) {
        res.render('index', {title: 'Домашняя страница', session: item !== null});
    });
  });

});
于 2013-05-28T12:04:36.303 回答