2013-06-16 21 views
11

MongoClientのドキュメントでは、MongoServer,MongoDatabaseMongoCollection<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>で突然変異を起こさないようにしたいと思います(正確な静的な状態です)。

+2

はい、いいえ。フィールドの通常の操作は他のスレッド/タスクの「状態」を変更しませんが、誤って状態を変更しないように(値を誤って上書きする、値を割り当て解除するなど)、秘密の方法で変更する関数を隠す(カプセル化する)ことができます。 C#のドライバコードであるこのコードを見てくださいユニットテスト:https://github.com/mongodb/mongo-csharp-driver/blob/296795e687d62dd97bd38204ccd026644fa76eae/MongoDB.DriverUnitTests/Configuration.cs –

+2

MongoCursorクラスは*ではないことに注意してください*スレッドセーフなので、あなたの例は良いものです - コレクションからカーソルを戻す - コレクションフィールドでは安全ですが、返されるカーソルはもちろんスレッドセーフではなく、タスク間で共有してはいけません。 –

+1

@AsyaKamskyありがとうございました。しかし、ここで 'MongoCursor'は(共有静的フィールドのような)共有リソースとして使われていません。しかし、私は 'MongoCollection 'がスレッドセーフであるかどうか、まだリンクされているサンプルを見ることでは分かりません。 –

答えて

10

this pageから、MongoServer、MongoDatabase、MongoClient、MongoCollection、MongoGridFSはスレッドセーフであることがわかります。 MongoCursorは具体的にはではなく、スレッドセーフです。

これは、「状態」の変更を心配することなく複数のタスクから安全にアクセスできますが、値の設定や変更には注意が必要です。

あなたの質問に特に、コレクション(カーソルオブジェクトを返す)を照会するとでなく、はMongoCollectionオブジェクトを変更します。

関連する問題