2013-06-16 26 views
11

W dokumentacji dla MongoClient, MongoServer, MongoDatabase i MongoCollection<T> Widzę, że mówi się, że są bezpieczne dla wątków.MongoDB C# Driver and Thread Safety

Pytanie: Czy to oznacza, że ​​mogę mieć (na przykład) ich statyczne pola w klasie i uzyskać do nich dostęp z dowolnego numeru Task/Thread?

odczuwalna:

public static MongoClient Client = new MongoClient(Properties.Settings.Default.MongoConnStr); 
public static MongoServer Server = Client.GetServer(); 
public static MongoDatabase DraftDB = Server.GetDatabase("draftdb"); 
public static MongoCollection<MyDoc> Docs = Program.DraftDB.GetCollection<Location>("mydocs"); 

Specjalnie o MongoCollection<T>; Chcę mieć pewność, że coś takiego jak var cursor = Docs.Find(query).SetLimit(50); nie wykonuje mutacji na MongoCollection<T> (to jest statyczny stan, aby być precyzyjnym).

+2

tak tak i nie. podczas gdy normalne operacje na polach nie zmienią ich "stanu" dla innych wątków/zadań, możesz chcieć ukryć (enkapsulować) funkcje mutowania w prywatnych metodach, aby uniknąć przypadkowego zmienienia ich stanu (na przykład przypadkowego nadpisania lub cofnięcia przypisania wartości). Rzuć okiem na ten kod, którym jest kod sterownika C# Testy jednostkowe: https://github.com/mongodb/mongo-csharp-driver/blob/296795e687d62dd97bd38204ccd026644fa76eae/MongoDB.DriverUnitTests/Configuration.cs –

+2

Zwróć uwagę, że klasa MongoCursor to * nie * Wątek bezpieczny, więc twój przykład jest dobry - odbieranie kursora z kolekcji - jest bezpieczny dla pola zbierania, ale zwracany kursor nie jest oczywiście bezpieczny dla wątków i nie może być dzielony między zadania. –

+1

@AsyaKamsky Thanks; Ale tutaj 'MongoCursor' nie jest używany jako zasób udostępniony (jak publiczne pole statyczne). Ale nie wiem "MongoCollection " jest bezpieczny dla wątków, czy też nie, patrząc na połączoną próbkę. –

Odpowiedz

10

Od this page wiesz, że MongoServer, MongoDatabase, MongoClient, MongoCollection i MongoGridFS są bezpieczne dla wątków. MongoCursor jest specyficznie , a nie bezpieczny dla wątków.

Oznacza to, że można bezpiecznie uzyskać do nich dostęp z wielu zadań, nie martwiąc się o to, że zmieniają swój "stan" - jednak nadal musisz zadbać o to, jak ustawić lub zmienić ich wartości.

W odniesieniu do pytania, zapytanie do kolekcji (która zwraca obiekt kursora) powoduje, że nie zmienia obiektu MongoCollection pod numerem.