2017-04-06 10 views
0

私のアプリケーションは、複数のプロセス/スレッドが特定のコレクションから読んでいる場合、悪いことが起こるMongo dbにアクセスする必要があります。MongoDBに読み取りロックを設定するにはどうすればよいですか?

コレクション(または必要に応じてdb)から読み取るプロセスグループの能力を制限する必要があります。たとえば、複数のプロセスがデータベースからの読み取りを試みている場合、それらは順番にではなく、と並行して読み取ります。

+0

複数のプロセスがコレクションから読み取っていると悪いことが起こりますか?それは珍しい状況のように聞こえる、もっと教えてくれますか? –

+0

@VinceBowdrenはい。コレクションに含まれるドキュメントによって、コレクションに配置される次のドキュメントが決定されます。コレクションには重複がない必要があります。したがって、2つのプロセスが同時にコレクションから読み取っている場合、同じデータを読み取って同じ次のドキュメントを計算してから、同じドキュメントを書き込むことができます。これはアルゴリズムには悪いことです。 – user3919624

答えて

1

これはドライバレベルで実行できます。接続プールのサイズを1に設定すると、データベースへのすべてのアクセスが順番に行われます。これは、あなたが並列に を開設しているどのように多くのTCP接続を制御することができ、

プールサイズ:ドキュメントから

MongoClient.connect(url, { 
    poolSize: 1 
}); 

:nodejsで

はあなたにドライバを設定することができます。これのデフォルト値は5ですが、それはあなたが好きなだけ高く設定することができます。 ドライバはラウンドロビン戦略を使用して、 を送信し、tcp接続から読み取ります。

+0

複数の 'MongoClient'インスタンスが異なるプロセスで起動されても、これは機能しますか?たとえば、2つのプロセスが両方とも 'MongoClient.connect(url、{poolSize:1});'を実行すると、データベースは引き続き2つのプロセスからの接続を順番に受け入れますか? @kozakvoj – user3919624

+0

いいえ、データベースへのシーケンシャルなアクセスが本当に必要な場合(また、@VinceBowdrenと同じような状況です)、メッセージキューを使用できます。あなたのスレッドはdb readをキューに委譲し、完了したらそれらを返すようにする(非同期で)。 – kozakvoj

関連する問題