【问题标题】:What is the proper way to manage connections to Mongo with MongoJS?使用 Mongo JS 管理与 Mongodb 的连接的正确方法是什么?
【发布时间】:2016-12-04 23:44:27
【问题描述】:

我正在尝试使用MongoJS 作为 Node.js 中本机 Mongo 驱动程序的包装器。我正在使用 populate()save() 等方法将集合中的文档建模为 JavaScript 类。

在 C# 和 Java 等大多数语言中,我习惯于为每个查询显式连接然后断开连接。大多数示例仅给出连接示例,但在完成后从不关闭连接。我不确定驱动程序是否能够自行管理,或者我是否需要自己手动管理。文档很少。

以下是相关代码:

User.prototype.populate = function(callback) {
    var that = this;    

    this.db = mongo.connect("DuxDB");
    this.db.collection(dbName).findOne({email : that.email}, function(err, doc){
        if(!err && doc) {
            that.firstName  = doc.firstName;
            that.lastName   = doc.lastName;
            that.password   = doc.password;
        }

        if (typeof(callback) === "function"){
            callback.call(that);
        }

        that.db.close();
    });
};

我发现,一旦我在 MongoJS 对象上调用 close() 方法,我就无法再在后续调用中打开新连接。但是,如果我不调用此方法,则一旦所有异步调用完成,Node 进程就永远不会终止,就好像它正在等待与 Mongo 断开连接一样。

使用 MongoJS 管理与 Mongo 的连接的正确方法是什么?

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    如果您保持连接打开而不是断开连接,您的应用程序将获得更好的性能。与实际处理查询和更新所花费的时间相比,建立 TCP 连接,并且在 MongoDB 的情况下,在适当的情况下发现副本集/分片配置相对昂贵。最好“花费”一次并保持连接打开,而不是不断地重新做这项工作。

    【讨论】:

    • 有道理。当我不再需要对象(某种析构函数)时,是否有适当的时间关闭连接?或者当 JavaScript 垃圾收集对 MongoJS 对象的引用时,驱动程序是否考虑到了这一点?不调用 close() 永远不会允许 Node 进程在所有调用完成后在控制台中终止。
    【解决方案2】:

    不要为每个查询打开 + 关闭连接。打开连接一次,然后重新使用它。

    【讨论】:

      【解决方案3】:

      为所有调用重复使用您的数据库连接做类似这样的事情

      User = function(db) {
        this.db = db;
      }
      
      
      User.prototype.populate = function(callback) {
        var that = this;  
        this.db.collection(dbName).findOne({email : that.email}, function(err, doc){
            if(!err && doc) {
                that.firstName  = doc.firstName;
                that.lastName   = doc.lastName;
                that.password   = doc.password;
            }
      
            if (typeof(callback) === "function"){
                callback.call(that);
            }
        });
      };
      

      【讨论】:

        【解决方案4】:

        我相信它实际上会在每次请求后关闭连接,但它会在 mongodb 服务器配置中设置 {auto_reconnect:true},因此它会在需要时重新打开新连接。

        【讨论】:

          最近更新 更多