Node MongoDB内存泄漏问题

时间:2015-08-04 07:37:22

标签: node.js mongodb memory-leaks

我正在使用 Node.js 撰写网络服务。

此Web服务调用MongoDB和MSSQL。

对于MSSQL我使用npm mssql库,对于mongo,我使用本机npm mongodb 库。 我使用 Q 作为我的承诺库。

我发现内存泄漏问题 MongoDB 集合上运行查找。我只需要从连接中获取元素。并最终更新我得到的元素的状态。 请参阅下面的示例代码。

var Q = require('q');
var connection = require('..\connection.js'); //the connection module open a connection that can be used with pools.

function list(req, res) {
    return Q.Promise(function(resolve, reject, notify) {
      var collection = null;
      var result = [];
      var cursor = null;
      Q.fcall(function(){}).then(function() {
        collection = connection.collection(collectionName);
      })
      .then(function() {
        cursor = collection.find({ fieldstatus : 0 });
        return Q.Promise(function(resolve, reject, notify) {
          Q.allSettled(cursor.each(function(err, item){
            return Q.fcall(function(){
              try {
                if(item != null) {
                  result.push({
                    field1 : item.field1,
                    field2 : item.field2,
                    fieldstatus : item.fieldstatus
                  });
                  collection.update({_id: item._id}, {$set: {fieldstatus : 1}});
                }
                resolve(result);
              } catch (err){
                reject(err);
              }
            })
            .fin(function() {
              cursor.close();
            });
          }));
        });
      })
      .then(function(ret) {
        resolve(ret);
      })
      .fail(function(err) {
        reject([ err.toString() ]);
      })
      .fin(function() {
        result = null;
        cursor = null;
        collection = null;
      });
    })
    .fail(function(err) {
      throw([ err.toString() ]);
    });
  }
}

更新:回答1

下面的代码似乎没有泄漏问题。

var Q = require('q');
var connection = require('..\connection.js'); //the connection module open a connection that can be used with pools.

function list(req, res) {
    return Q.Promise(function(resolve, reject, notify) {
      var collection = null;
      var result = [];
      var cursor = null;
      Q.fcall(function(){}).then(function() {
        collection = connection.collection(collectionName);
      })
      .then(function() {
        return Q.npost(
          collection,
          "find",
          [ 
            { fieldstatus : 0 }
          ]
        ).then(function(ret){
          return Q.npost(ret, "toArray").then(function(item){
            return item;
          });
        })
        .then(function(ret){
          var result = [];
          ret.forEach(function (item) {
            result.push({
              field1 : item.field1,
              field2 : item.field2,
              fieldstatus : item.fieldstatus
            });
            collection.update({_id: item._id}, {$set: {fieldstatus : 1}});
          });
          return result;
        })
      })
      .then(function(ret) {
        resolve(ret);
      })
      .fail(function(err) {
        reject([ err.toString() ]);
      })
      .fin(function() {
        collection = null;
      });
    })
    .fail(function(err) {
      throw([ err.toString() ]);
    });
  }
}

0 个答案:

没有答案