问题 MongoDB C#驱动程序和线程安全


在文档中 MongoClientMongoServerMongoDatabase 和 MongoCollection<T> 我看到它说它们是线程安全的。

问题:这是否意味着我可以在类中拥有(例如)静态字段并从中访问它们 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> (确切地说,它是静态的)。


5211
2018-06-16 08:58


起源

是的,不是。虽然对字段的正常操作不会改变其他线程/任务的“状态”,但您可能希望隐藏(封装)私有方法中的变异函数,以避免错误地更改其状态(例如意外覆盖或取消分配它们的值)。看看这段代码是C#驱动程序代码单元测试: github.com/mongodb/mongo-csharp-driver/blob/... - Asya Kamsky
注意MongoCursor类是 不 线程安全,所以你的例子很好 - 从一个集合中获取一个光标 - 它对于集合字段是安全的,但返回的光标当然不是​​线程安全的,不能在任务之间共享。 - Asya Kamsky
@AsyaKamsky谢谢;但在这儿 MongoCursor 不用作共享资源(如公共静态字段)。但是我不知道 MongoCollection<MyDoc> 通过查看链接的样本,是否是线程安全的。 - Kaveh Shahbazian
你知道MongoCollection在这里是线程安全的: docs.mongodb.org/ecosystem/tutorial/use-csharp-driver/... - Asya Kamsky
@AsyaKamsky谢谢;请添加它作为答案,以便我可以将其标记为答案。 - Kaveh Shahbazian


答案:


这一页 你知道MongoServer,MongoDatabase,MongoClient,MongoCollection和MongoGridFS是线程安全的。 MongoCursor是专门的  线程安全的。

这意味着您可以安全地从多个任务访问它们,而无需担心改变其“状态” - 但是您仍然需要注意如何设置或更改其值。

特别是对你的问题,查询一个集合(返回一个游标对象)  改变MongoCollection对象。


10
2018-06-17 01:33