NodeJS - MongoDB: 如何使用已开启的连接

3
在使用模块时,最好是打开一个新连接或重用现有连接?因为我习惯将代码分成几个文件。
a.js
module.exports = function (req, res) {

  new mongodb.... (err, db) { // open a connection
    b(function (err, result) {
      db.close(); // close the connection
      res.send(result);
    });
  });

};

b.js

// re-open a connection ? or take the connection of "a.js" ? (passing "db")

当使用异步方式时,必须小心地继续使用同一个连接(套接字)。这样可以确保下一次操作在写入完成后才开始。

谢谢!

1个回答

6
当你第一次使用require('somemodule')来加载模块,然后再次使用它进行第二次加载时,它将使用已经加载的实例。这使得您可以轻松创建单例。
因此,在sharedmongo.js中:
var mongo = require('mongodb');

// this variable will be used to hold the singleton connection
var mongoCollection = null;

var getMongoConnection = function(readyCallback) {

  if (mongoCollection) {
    readyCallback(null, mongoCollection);
    return;
  }

  // get the connection
  var server = new mongo.Server('127.0.0.1', 27017, {
    auto_reconnect: true
  });

  // get a handle on the database
  var db = new mongo.Db('squares', server);
  db.open(function(error, databaseConnection) {
    databaseConnection.createCollection('testCollection', function(error, collection) {

      if (!error) {
        mongoCollection = collection;
      }

      // now we have a connection
      if (readyCallback) readyCallback(error, mongoCollection);
    });
  });
};
module.exports = getMongoConnection;

然后在a.js文件内:

var getMongoConnection = require('./sharedmongo.js');
var b = require('./b.js');
module.exports = function (req, res) {
  getMongoConnection(function(error, connection){
    // you can use the Mongo connection inside of a here
    // pass control to b - you don't need to pass the mongo
    b(req, res);
  })
}

b.js内部:

var getMongoConnection = require('./sharedmongo.js');
module.exports = function (req, res) {
  getMongoConnection(function(error, connection){
    // do something else here
  })
}

a.jsb.js同时调用getMongoCollection时,第一次会连接,第二次会返回已经连接的那个。这样可以确保你正在使用同一个连接(套接字)。


1
因为在你的例子中,每次访问网页都会关闭Mongo连接,然后为下一次访问重新打开它——如果你每秒钟得到2000个访问,那么这将增加很多工作量(比如慢几倍)...... 这个想法是要有一个新的mongodb.... (err, db)在函数(req, res)之外,这样它就不必为每个网页重新连接... - Bino Carlos
1
嘿,伙计 - 使用Redis,您可以复制相同的想法 - 在sharedredis.js中,您将拥有getRedisConnection,它返回并分配到缓存...为了检测断开连接 - 您可以添加:db.on('close', function(){ //在此处重新构建连接的代码 })我会把如何插入这个留给你 :) - Bino Carlos
1
我不能说这是“最好的”解决方案,但它允许我在单个进程中使用单个数据库连接,目前没有任何问题 - 我建议您将其插入到您的代码中并理解它,因此您将知道它是最佳解决方案 :) - Bino Carlos
1
嘿,伙计 - 我刚回答了一个类似的问题 - 上面的库有更好的版本:) http://stackoverflow.com/questions/12037655/node-js-mongodb-native-driver-connection-sharing/12039606#12039606 - Bino Carlos
我不知道你是否有聊天通知,以便回答 :) - 或许你更喜欢在这里讨论? - user1255808
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接