8

jestem bardzo nowy MongoDB i NoSQL w ogóle, a ja dopiero się rozpoczął budowanie witryny z MongoDB/Normy/ASP.NET MVC 3.Kiedy należy otwierać i zamykać połączenia MongoDB?

Zastanawiam się w jaki sposób należy określenie zakresu połączenia do mojej bazy danych Mongo .

W tej chwili mam Basecontroller, który wprowadza MongoSession i onActionExecuted i pozbyć go, aby wszystkie moje pochodne kontrolery miały dostęp do mojej MongoSession. Klasa MongoSession otwiera połączenie w swoim konstruktorze i udostępnia je w Dispose(), tak jak dzisiaj.

private IMongo _mongo; 

public MongoSession() 
{   
    _mongo = Mongo.Create("connString");  
} 

public void Dispose() 
{ 
    _mongo.Dispose(); 
} 

Trochę się martwię, że może utrzymywać zbyt długie połączenia, jeśli robię inne rzeczy w kontrolerach.

Czy jest to podejście, które nie naraża na ryzyko otwarcia zbyt wielu połączeń lub czy powinienem zrobić coś bardziej podobnego do poniższej przykładowej metody?

public void Add<T>(T item) where T : class, new() 
    { 
     using (var mongo = Mongo.Create("connString")) 
     { 
     mongo.GetCollection<T>().Insert(item); 
     } 
    } 

Innym śledzić pytanie brzmi:

Czy otwieranie i zamykanie połączeń MongoDB przez Norma „drogie” operacji?

+0

Norma jest ledwo utrzymuje się dłużej, jeśli chcesz iść wsparcie LINQ z oficjalnym kierowcą Mongo z FluentMongo na wierzchu. –

+0

Oprócz tej kwestii otwierania i zamykania połączeń na kodzie, miałem problemy z zamknięciem połączenia dostawcy Internetu, a następnie mój kod o wyjątku EndOfStreamException. Rozwiązałem go za pomocą settings.MaxConnectionIdleTime = TimeSpan.FromSeconds (30); https://stackoverflow.com/a/44606284/194717 – Tony

Odpowiedz

8

Pozostawiłbym połączenie otwarte, ponieważ ponowne utworzenie połączenia jest kosztowne. Mongo jest w porządku z wieloma połączeniami, otwartymi przez długi czas. Najlepiej zrobić to, aby udostępnić połączenie ze wszystkimi częściami aplikacji jako trwałe połączenie. Sterownik C# powinien być na tyle sprytny, aby sam to zrobić, aby nie tworzył zbyt wielu połączeń, ponieważ wewnętrznie używa "puli połączeń", co sprawia, że ​​nawet ponownie używają połączeń. Dokumenty mówią: "Połączenia z serwerem są obsługiwane automatycznie za kulisami (pula połączeń jest używana do zwiększenia wydajności)."

okrzyki, Derick

+1

Uzgodnione. W rzeczywistości nie trzeba nawet pisać klasy MongoSession - właściwe byłoby przechowywanie instancji MongoServer w zakresie aplikacji. Powinieneś prawie nazywać Disconnect() na tym wystąpieniu tylko raz, gdy aplikacja MVC zostanie zamknięta. –

+0

@Sean Dzięki za wskazówkę, kiedy należy zamknąć połączenia. –

2

nie trzeba Call podłączać lub odłączać

the # kierowca C ma puli połączeń do efektywnego korzystania z połączenia z serwerem. Nie ma potrzeby, aby dzwonić Połącz lub Rozłącz; pozwól kierowcy zająć się połączeniami (wywołanie Connect jest nieszkodliwe, ale wywołanie Disconnect jest złe, ponieważ zamyka wszystkie połączenia w puli połączeń).

http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-csharp-driver/

+0

Link (teraz) nic nie mówi, to tylko strona nadrzędna kilku innych. – danio