È 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);
}
});
});
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