Node.js Mongodb-native driver connection sharing

后端 未结 2 714
情深已故
情深已故 2021-02-11 05:06

main.js

var http = require(\'http\');
var UserModel = require(\'./models/user.js\');
var server = http.createServer(function(req, res){         


        
2条回答
  •  难免孤独
    2021-02-11 05:31

    you could have a library that wraps all this up nicely - it means that only one connection to the database will be opened and the same (open) connection will be returned for the second request - if you are getting 1000+ per second, this is a make-or-break issue (i.e. not re-opening the connection each request)...

    users.js:

    var connections = require('./connections.js');
    
    var serverCache = connections('127.0.0.1', 27017); 
    
    module.exports = {
      create: function(newData, callback){
        serverCache('main', 'users', function(e, collection){
          collection.insert(newData, callback);
        })
      }
    }
    

    connections.js

    var mongo = require('mongodb');
    
    // a mongo connection cache
    // pass in host & port
    // it returns a function accepting dbName, collectionName & callback
    var mongoCache = function(host, port){
    
      // keep our open connections
      var mongoDatabases = {};
    
      var ensureDatabase = function(dbName, readyCallback){
        // check if we already have this db connection open
        if(mongoDatabases[dbName]){
          readyCallback(null, mongoDatabases[dbName]);
          return;
        }
    
        // get the connection
        var server = new mongo.Server(host, port, {auto_reconnect: true});
    
        // get a handle on the database
        var db = new mongo.Db(dbName, server);
        db.open(function(error, databaseConnection){
          if(error) throw error;
    
          // add the database to the cache
          mongoDatabases[dbName] = databaseConnection;
    
          // remove the database from the cache if it closes
          databaseConnection.on('close', function(){
            delete(mongoDatabases[dbName]);
          })
    
          // return the database connection
          readyCallback(error, databaseConnection);
        })
      }
    
      var ensureCollection = function(dbName, collectionName, readyCallback){
    
        ensureDatabase(dbName, function(error, databaseConnection){
          if(error) throw error;
    
          databaseConnection.createCollection(collectionName, function(error, collection) {
            if(error) throw error;
    
            // return the collection finally
            readyCallback(error, collection);
          })
    
        })
      }
    
      return ensureCollection;
    }
    
    module.exports = mongoCache;
    

提交回复
热议问题