MongoClient
のドキュメントでは、MongoServer
,MongoDatabase
とMongoCollection<T>
私はスレッドセーフであると言われています。MongoDB C#ドライバとスレッドの安全性
質問:クラス内の静的フィールドを(例えば)持つことができますか?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>
で突然変異を起こさないようにしたいと思います(正確な静的な状態です)。
はい、いいえ。フィールドの通常の操作は他のスレッド/タスクの「状態」を変更しませんが、誤って状態を変更しないように(値を誤って上書きする、値を割り当て解除するなど)、秘密の方法で変更する関数を隠す(カプセル化する)ことができます。 C#のドライバコードであるこのコードを見てくださいユニットテスト:https://github.com/mongodb/mongo-csharp-driver/blob/296795e687d62dd97bd38204ccd026644fa76eae/MongoDB.DriverUnitTests/Configuration.cs –
MongoCursorクラスは*ではないことに注意してください*スレッドセーフなので、あなたの例は良いものです - コレクションからカーソルを戻す - コレクションフィールドでは安全ですが、返されるカーソルはもちろんスレッドセーフではなく、タスク間で共有してはいけません。 –
@AsyaKamskyありがとうございました。しかし、ここで 'MongoCursor'は(共有静的フィールドのような)共有リソースとして使われていません。しかし、私は 'MongoCollection'がスレッドセーフであるかどうか、まだリンクされているサンプルを見ることでは分かりません。 –