2013-06-16 24 views
11

In der Dokumentation für MongoClient, MongoServer, MongoDatabase und MongoCollection<T> ich sehe, dass es gesagt wird, dass sie Thread-sicher sind.MongoDB C# Treiber und Threadsicherheit

Frage: Heißt das, ich kann (zum Beispiel) statische Felder von ihnen in einer Klasse haben und auf sie von jedem Task/Thread zugreifen?

Like:

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"); 

Speziell über MongoCollection<T>; Ich möchte sicher sein, dass etwas wie var cursor = Docs.Find(query).SetLimit(50); keine Mutation auf der MongoCollection<T> durchführt (Es ist, um genau zu sein, statischer Zustand).

+2

ja und nein. während des normalen Betriebs auf den Feldern nicht ihre „Zustand“ ändern für andere Threads/Aufgaben, möchten Sie vielleicht (encapsulate) mutiert Funktionen in privaten Methoden verstecken. nicht zu verändern ihren Zustand durch Fehler (wie versehentliches Überschreiben oder Aufheben von Zuweisungen ihren Wert) Werfen Sie einen Blick auf diesen Code, der C# Treibercode Unit-Tests ist: https://github.com/mongodb/mongo-csharp-driver/blob/296795e687d62dd97bd38204ccd026644fa76eae/MongoDB.DriverUnitTests/Configuration.cs –

+2

beachten Sie, dass MongoCursor Klasse ist * nicht * fädeln sicher, so dass Ihr Beispiel gut ist - einen Cursor zurück aus einer Sammlung bekommen - es für die Sammlung Feld sicher ist aber der Cursor zurückgegeben wird, ist natürlich nicht Thread-sicher und nicht zwischen Aufgaben geteilt werden muss. –

+1

@AsyaKamsky Danke; Aber hier wird 'MongoCursor' nicht als gemeinsame Ressource verwendet (wie ein öffentliches statisches Feld). Aber ich weiß nicht, MongoCollection 'ist threadsicher, oder nicht, noch, indem Sie auf das verbundene Beispiel schauen. –

Antwort

10

Von this page wissen Sie, dass MongoServer, MongoDatabase, MongoClient, MongoCollection und MongoGridFS threadsicher sind. MongoCursor ist speziell nicht Thread-Safe.

Dies bedeutet, dass Sie sicher von mehreren Tasks aus zugreifen können, ohne sich Gedanken darüber machen zu müssen, dass sich ihr "Status" ändert - Sie müssen jedoch trotzdem darauf achten, wie sie ihre Werte setzen oder ändern.

Speziell zu Ihrer Frage mutiert das Abfragen einer Auflistung (die ein Cursorobjekt zurückgibt) nicht das MongoCollection-Objekt.