2015-04-17 3 views
0

Я действительно испытываю стресс из моего кода подключения MongoDB.Ограничение подключения к драйверу MongoDB в Node.js

Я недавно заметил, что у меня много открытых подключений. В конечном итоге достигается ошибка «ограничение соединения» (в Linux), и я должен перезапустить все, чтобы заставить его работать.

db.js:

var mongodb = require('mongodb'); 
var connection = null; 

exports.getCollection = function(name, connectionConfig){ 
return getConnection(connectionConfig) 
    .then(function(conn){ 
     return conn.collection(name); 
    }) 
    .catch(function(err){ 
     throw err; 
    }); 
}; 

function getConnection(configuration){ 
return promise(function(deferred){ 
    configuration = configuration ||  config.envConfig.mongoConnections[0]; 
    var isMainConnection = configuration === config.envConfig.mongoConnections[0]; 
    if (isMainConnection && connection){ 
     return { result: connection, isImediate: true }; 
    } 

    var server = getServer(configuration); 
    var db = new mongodb.Db(configuration.name, server, { safe: true, auto_reconnect: true }); 

    function openConnection(err, c){ 
     if (err){ 
      return deferred.reject(err); 
     } 
     if (isMainConnection){ 
      connection = c; 
     } 
     console.log("Db connection opened."); 
     c.authenticate(configuration.user, configuration.pass, function (err){ 
      if (err) { 
       c.close(); 
       return deferred.reject(err); 
      } 
      return deferred.resolve(c); 
     }); 
     c.on('close', function(){ 
      console.log("Db connection closed."); 
      connection = null; 
      return deferred.reject(new Error("Db closed.")); 
     }); 
    } 

    db.open(openConnection); 
    return deferred.promise; 
}); 
} 

function getServer(config){ 
return new mongodb.Server(config.host, config.port, { auto_reconnect:  true }); 
} 

Может кто-нибудь мне помочь?

ответ

1

Похоже, вы открываете новое соединение (которое тогда не закрыто) для каждого запроса: вам не нужно это делать.

Вы должны позвонить только getConnection() и сохранить обработчик соединения где-нибудь, чтобы использовать его в каждом маршруте. Глобальная переменная может работать или добавить ее в ваше приложение Express.

PS: вы также можете указать Mongoose a try, maybe;)

Смежные вопросы