1

私はMongoDBが初めてです。MongoDB をデータベースとして使用して Java アプリを作成しました。レプリカ セットに 3 つのサーバーを構成しました。私の疑似コード: {

createUser getUser updateUser

}

ここで、createUser はユーザーを正常に作成しますが、getUser はそのユーザーを返さないことがあります。

私が分析したところ、これはデータ レプリケーションのレイテンシによるものです。

どうすればこの問題を克服できますか?

作成時にすぐにデータを複製する方法はありますか?

必ずユーザーを取得する他の方法はありますか?

事前にt​​hx!

4

3 に答える 3

0

私はJavaドライバーに精通していませんが、wjのオプションがあります。

wオプションは、書き込み操作が、プライマリを含む指定された数のレプリカセットメンバーに複製されたことを確認します。

jは、ジャーナルに操作を書き込んだ後でのみ、書き込み操作を確認します。

WriteConcernを使用する必要があるようです。

于 2013-03-02T22:30:58.540 に答える
0

新しい Mongo Java ドライバー バージョンでは、slaveOk プロパティは ReadPreference (この場合は .SECONDARY) として知られるようになりました。これは、Mongo/DB/Collection レベルで設定できます。これらのレベルで ReadPreference を設定すると、すべての呼び出し元に適用されることに注意してください (つまり、これらのオブジェクトはスレッド間で共有されます)。

もう 1 つの方法は、ReadPreference.SECONDARY を試して、失敗した場合はそれなしで試して、マスターに移動することです。このロジックはリポジトリ レイヤーに分離できるため、サービス レイヤーで処理する必要はありません。これを行う場合は、DBQuery オブジェクトで ReadPreference を設定することをお勧めします。これは使用ごとに行われます。

于 2012-08-24T05:59:43.790 に答える
0

問題がレプリケーションの遅延によるものであることが確実な場合、できることの 1 つは、書き込みが安全であり、wフラグを使用していることを確認することです。そうすれば、MongoDB はデータが少なくともnノードにレプリケートされるまで待機してから戻ります。これは、クライアント ドライバーからも実行できます。

MongoDB getLastError

と読んでいslaveOk=Trueますか?ReplicaSet プライマリから読み取る場合、これも問題にはなりません。

于 2012-06-13T18:55:22.180 に答える