1

私はjunitテストを作成しようとしています。シナリオ:

  • セットアップ: 2 つの json ドキュメントをデータベースに追加しています
  • テスト: ビューを使用してこれらのドキュメントを取得しています
  • TearDown: 両方のオブジェクトを削除しています

私の見解:

function (doc, meta) {
  if (doc.type && doc.type == "UserConnection") {
    emit([doc.providerId, doc.providerUserId], doc.userId);
  } 
}


これは、これらのドキュメントをデータベースに追加し、「追加」が同期していることを確認する方法です。

public boolean add(String key, Object element) {
    String json = gson.toJson(element);
    OperationFuture<Boolean> result = couchbaseClient.add(key, 0, json);
    return result.get();
}


追加する JSON ドキュメント: {"userId":"1","providerId":"test_pId","providerUserId":"test_pUId","type":"UserConnection"} {"userId":"2" ,"providerId":"test_pId","providerUserId":"test_pUId","type":"UserConnection"}

これは私がビューを呼び出す方法です:

View view = couchbaseClient.getView(DESIGN_DOCUMENT_NAME, VIEW_NAME);
Query query = new Query();
query.setKey(ComplexKey.of("test_pId", "test_pUId"));
ViewResponse viewResponse = couchbaseClient.query(view, query);


問題:

  • ビューからフェッチされた要素の数が無効であるため、テストは失敗します。

私の観察:

  • たまにテストが通る
  • ビューから取得される要素の数が一定ではありません (0 から 2)
  • setUp を呼び出す代わりにこれらのドキュメントをデータベースに追加すると、毎回テストに合格しました
  • このhttp://www.couchbase.com/docs/couchbase-sdk-java-1.1/create-update-docs.htmlドキュメントによると、返された Future オブジェクトで get() を呼び出して、これらの json ドキュメントを同期的に追加しています。

私の質問:

  • このデータが DB に挿入された直後に、ビューからデータをフェッチする方法に問題がありますか? この問題を解決するための良い方法はありますか? そして、誰かが私にそれを説明してくれませんか?

ありがとう、
ダリウス

4

1 に答える 1

1

Couchbase 2.0 では、ドキュメントがビューに表示される前にディスクに書き込む必要があります。Java SDK を使用して操作を行う方法は 3 つあります。1 つ目は非同期です。つまり、データを送信するだけで、後でデータが正しく受信されたことを確認できます。上記のように、非同期操作を実行してすぐに .get() を呼び出すと、同期操作が作成されます。上記の 2 つのケースで操作が成功を返した場合、アイテムがメモリに書き込まれたことが保証されるだけです。クエリを実行する前に両方のアイテムがディスクに書き込まれたという幸運に恵まれたという理由だけで、テストが成功する場合があります。

操作を実行する 3 つ目の方法は、耐久性要件を使用する方法であり、これはテストで実行したい方法です。耐久性要件により、成功がクライアントに返される前に、アイテムをディスクに書き込むか複製する必要があると言えます。次の関数を見てください。

https://github.com/couchbase/couchbase-java-client/blob/1.1.0/src/main/java/com/couchbase/client/CouchbaseClient.java#L1293

この関数を使用して、PersistedTo パラメータを MASTER に設定します。

于 2013-02-26T18:01:36.160 に答える