2013-06-16 1 views
11

В документации для MongoClient, MongoServer, MongoDatabase и MongoCollection<T> Я вижу, что сказано, что они потокобезопасны.MongoDB C# Driver and Thread Safety

Вопрос: Означает ли это, что у меня могут быть (например) статические поля из них в классе и доступ к ним из любого Task/Thread?

Как:

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

Специально о MongoCollection<T>; Я хочу быть уверенным, что что-то вроде var cursor = Docs.Find(query).SetLimit(50); не выполняет мутацию на MongoCollection<T> (это статическое состояние, если быть точным).

+2

так что да и нет. в то время как нормальные операции над полями не изменят свое «состояние» для других потоков/задач, вы можете скрыть (инкапсулировать) мутирующие функции в частных методах, чтобы избежать изменения их состояния по ошибке (например, случайно переписать или отменить их значение). Взгляните на этот код, который является кодом кода C#. Единичные тесты: https://github.com/mongodb/mongo-csharp-driver/blob/296795e687d62dd97bd38204ccd026644fa76eae/MongoDB.DriverUnitTests/Configuration.cs –

+2

Обратите внимание, что класс MongoCursor is * not * потокобезопасный, так что ваш пример хороший - верните курсор из коллекции - он безопасен для поля коллекции, но возвращаемый курсор, конечно, не является потокобезопасным и не должен быть разделен между задачами. –

+1

@ АсяКамский Спасибо; Но здесь «MongoCursor» не используется как общий ресурс (например, публичное статическое поле). Но я не знаю, 'MongoCollection ' является потокобезопасным, или нет, однако, просмотрев связанный образец. –

ответ

10

От this page вы знаете, что MongoServer, MongoDatabase, MongoClient, MongoCollection и MongoGridFS являются потокобезопасными. MongoCursor в частности не поточно-безопасный.

Это означает, что вы можете безопасно обращаться к ним из нескольких задач, не беспокоясь об этом, изменяя свое «состояние» - однако вам все равно нужно заботиться о том, как устанавливать или изменять их значения.

В частности, на ваш вопрос запрос к коллекции (которая возвращает объект курсора) делает не мутирует объект MongoCollection.