2013-04-30 14 views
5

È buona pratica in nodejs aprire la connessione mongodb per ogni richiesta e chiuderla nel callback?mongodb nodejs collegamento nativo al driver nativo o no

app.get('/some_route', function(){ 
     MongoClient.connect(url,function(err, db){ 
      //some db query with callback 
      db.collection("some_collection").findOne(doc, function(err,item){ 
       if(err){ 
         res.send(err); 
         //close db connection 
         db.close(); 
       }else{ 
         //do something with item 
         res.send(item); 
         //close db connection 
         db.close(); 
       } 

     }); 
    }); 

Alcuni dicono che l'apertura/chiusura della connessione mongodb su ciascuna richiesta non è necessaria, in quanto una volta aperto, un pool di connessioni può essere condiviso.

La domanda è come mantenere e condividere quel pool? La mangusta lo fa già automaticamente?

In particolare, in caso di timeout o disconnessione di mongodb, è necessario ricollegarlo?

trovo risposte contraddittorie qui close mongodb connection per request or not

Quasi tutto il doc nodejs mongodb native driver e l'esempio di codice in linea che ho letto, un db.open() è accoppiato con db.Close() da qualche parte nel callback.

Perché se un pool di connessione è condivisa, si potrebbe codificare Secondo la risposta di christkv, un codice potrebbe:

var p_db=null; 
var c_opt = {server:{auto_reconnect:true}}; 

app.get('/some_route', function(){ 
     //pseudo code 
    if (!p_db){ 
      MongoClient.connect(url, c_opt, function(err,db){ 
        p_db = db; 
        p_db.collection("some_collection").findOne(doc, function(err,item){ 
        if(err){ 
         res.send(err);       
        }else{ 
         //do something with item 
         res.send(item); 
        } 

      }); 
      }); 
     }else { 
      p_db.collection("some_collection").findOne(doc, function(err,item){ 
       if(err){ 
         res.send(err); 
       }else{ 
         //do something with item 
         res.send(item); 
       } 

     }); 
    }); 
+0

Ho letto la mangusta src alcuni mesi fa, hanno aperto una connessione per collezione, quindi è solo memorizzata nella cache. non sono sicuro che possano essere cambiati. Scrivo un modulo per la connessione ed eseguo prima di app.listen. – wayne

risposta

5

Non devi fare nulla per ricollegare come il driver tenterà di riconnettersi in caso di fallimento. Mentre attende che si verifichi la riconnessione, bufferizzerà tutte le operazioni in corso e le ripeterà una volta che la connessione è attiva. Se vuoi controllarlo da solo, puoi ascoltare l'evento "close" sull'istanza db e gestire la riconnessione manualmente. Al momento della riconnessione, l'oggetto db sarà ancora utilizzabile in quanto un db è in realtà solo un wrapper attorno al pool di connessioni condivise e non contiene la propria logica di connessione separata.

8

According to un importante contributo alla sorgente del driver, è meglio per la connessione a database all'avvio e continua a riutilizzare la stessa connessione per ogni richiesta.

Il driver mongodb nativo dispone di un pool di connessioni gestito internamente e attualmente impostato su un massimo di 5 connessioni aperte. È possibile configurare il numero massimo di connessioni tramite l'opzione maxPoolSize. È anche possibile configurare la connessione per riconnettersi automaticamente con l'opzione auto_reconnect.

Vedere la documentazione here