2012-04-20 23 views

Odpowiedz

24

W the official documentation jest powiedziane, że MongoServer, MongoDatabase i MongoCollection są bezpieczne dla wątków, i że powinniśmy stworzyć pojedynczą MongoServer dla każdej bazy danych, które łączą się.

Tak więc MongoServer, MongoDatabase i MongoCollection można bezpiecznie skonfigurować jako pojedyncze. MongoServer pomoże nawet wymusić to, zwracając tę ​​samą instancję MongoDatabase dla kolejnych wywołań, a MongoDatabase zrobi to samo dla MongoCollection s.

tj. Twoja instancja MongoServer może być bezpiecznie skonfigurowana tak, aby miała jednorodny styl życia w twoim pojemniku IoC, możesz równie dobrze skonfigurować wtrysk dla MongoDatabase, a może nawet MongoCollection.

Używam tej strategii z Windsoru myself - można zobaczyć moje MongoInstaller tutaj: https://gist.github.com/2427676 - pozwala moje zajęcia po prostu zrób to:

public class SomeClass 
{ 
    public SomeClass(MongoCollection<Person> people) 
    { ... } 
} 

aby mieć zbiór wstrzyknięciu ładne i gotowe do użycia.

+0

Dziękujemy za udostępnienie WindsorInstaller. Kod jest nieco stary i zastanawiałem się, czy masz zaktualizowaną wersję nowego mongodriver 2.0? Próbowałem go uaktualnić sam, ale nie jestem pewien, czy istnieje lepszy sposób? ' https://gist.github.com/kri5t/afcba8068badb62f5c9b –

2

Wstrzyknij za pomocą dowolnego pojemnika IOC (mapa struktury, Windsor itp.) I utrzymuj jego żywotność na żądanie.

+0

Oznacza to utworzenie instancji serwera dla jednego wątku żądania. Zakładam, że sterownik obsługuje pulę połączeń. Czy to jest poprawne? – Roman

+1

Tak, 'MongoServer' zarządza pulą połączeń i NIE powinien być tworzony w kółko. Zobacz http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial #CSharpDriverTutorial- TheC%23Driver, aby uzyskać więcej informacji ("Utworzysz jedną instancję tej klasy dla każdego serwera, z którym się łączysz. serwer jest obsługiwany automatycznie za kulisami (pula połączeń jest używana do zwiększenia wydajności). ") – mookid8000

7

Sterownik C# automatycznie zarządza połączeniami z serwerem (korzysta z puli połączeń). Nie ma potrzeby wywoływania serwera. Połącz się, gdy sterownik nawiąże połączenie automatycznie. Nie wywołuj funkcji server.Disconnect, ponieważ powoduje to zamknięcie wszystkich połączeń w puli połączeń i zakłóca efektywne łączenie połączeń.

Jeśli chodzi o zarządzanie cyklem życia instancji MongoServer, można go przechowywać w zmiennej statycznej i używać przez cały okres istnienia procesu (i udostępniać go w wątkach, jest bezpieczny dla wątków). Alternatywnie, możesz po prostu zadzwonić ponownie do MongoServer.Create, gdy potrzebujesz pobrać instancję serwera. Tak długo, jak długo będziesz dzwonić do MongoServer.Create z tym samym ciągiem połączenia, będziesz otrzymywać tę samą instancję MongoServer.

Powiązane problemy