2013-04-30 9 views
5

Czy jest dobrą praktyką w nodejs, aby otworzyć połączenie mongodb na każde żądanie i zamknąć go w callbacku?mongodb nodejs natywny sterownik blisko połączenia lub nie

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

     }); 
    }); 

Niektórzy stwierdzili, że otwarcie/zamknięcie połączenia mongodb na każdym żądaniu nie jest konieczne, ponieważ po otwarciu można udostępnić pulę połączeń.

Pytanie, jak konserwować i udostępniać tę pulę? Czy mangusta robi to automatycznie już?

W szczególności, na czas oczekiwania na mongody lub rozłączenie, czy trzeba go ponownie podłączyć?

znajdę sprzecznych odpowiedzi tutaj close mongodb connection per request or not

Prawie wszystkie doc nodejs mongodb native driver i przykładowy kod Internecie czytam, o db.open() jest powiązany z db.close() gdzieś w zwrotnego.

Bo jeśli pula połączenie jest dzielone, można kodować Według odpowiedź christkv za jeden kod może:

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

Przeczytałem mangusta src kilka miesięcy temu, otwierają jedno połączenie na kolekcję, więc jest ono po prostu buforowane w zmiennej. nie jestem pewien, czy mogą się zmienić. Piszę moduł do połączenia i uruchomić go przed app.listen. – wayne

Odpowiedz

5

Nie musisz nic robić, aby ponownie połączyć jako kierowca będzie próbował ponownie na niepowodzenie. Podczas oczekiwania na ponowne nawiązanie połączenia buforuje wszystkie operacje pomiędzy nimi i odtwarza je, gdy połączenie zostanie nawiązane. Jeśli chcesz kontrolować to samodzielnie, możesz odsłuchać zdarzenie "zamknij" na instancji db i ręcznie wykonać ponowne podłączenie. Po ponownym połączeniu obiekt db nadal będzie dostępny, ponieważ db jest tak naprawdę tylko opakowaniem wspólnej puli połączeń i nie zawiera własnej oddzielnej logiki połączenia.

8

According to głównym czynnikiem przyczyniającym się do źródła kierowcy, to najlepiej, aby połączyć się z przy uruchamianiu bazy danych i nadal używać tego samego połączenia dla każdego żądania.

Sterownik macierzysty mongodb ma pulę połączeń, którą obsługuje wewnętrznie i aktualnie domyślnie ma maksymalnie 5 otwartych połączeń. Możesz skonfigurować maksymalną liczbę połączeń za pomocą opcji maxPoolSize. Możesz również skonfigurować połączenie do automatycznego ponownego łączenia z opcją auto_reconnect.

zobacz dokumentację here

Powiązane problemy