1

私の状況は、次の3つの方法が与えられた場合です(Scalaでcouchbase-java-client 2.2を使用しました。Couchbaseサーバーのバージョンは4.1です):

def findAll() = {
    bucket.query(N1qlQuery.simple(select("*").from(i(DatabaseBucket.USER))))
      .allRows().toList
  }

  def findById(id: UUID) = {
    Option(bucket.get(id.toString, classOf[RawJsonDocument])).map(i => read[User](i.content()))
  }

  def upsert(i: User) = {
    bucket.async().upsert(RawJsonDocument.create(i.id.toString, write(i)))
  }

基本的には、挿入、id による検索、および findAll です。私は実験をしました:

  • を挿入し、その直後にUser1 つを見つけて、正しく挿入したユーザーを取得しました。findById

  • 挿入してfindAllその直後に使用すると、空が返されます。

  • 挿入して 3 秒の遅延を入れてから を使用するとfindAll、挿入したものを見つけることができます。

そのため、N1qlQuery は「永続化」レイヤーではなく、キャッシュされたレイヤーのみを検索していると思われます。では、「持続」レイヤーで検索させるにはどうすればよいですか?

4

2 に答える 2

3

N1QL を使用する Couchbase 4.0 では、更新/変更がインデックスの再計算を通じて伝播するためのさまざまなコストに対応する、クエリを実行するときに指定できるさまざまな一貫性レベルがあります。これらは、データが永続化されるかどうかとは関係ありませんが、クエリを発行するときのオプションです。デフォルトは「制限なし」であり、アップサート リクエストが考慮されることを確認するには、このクエリを「リクエスト プラス」として発行する必要があります。

探している効果を得るには、別の形式の simple() メソッドを使用して、N1qlQuery の作成時に N1qlPararms を追加する必要があります。ScanConsistency.REQUEST_PLUS でN1qlParamsを追加します。詳細については、Couchbase の Developer Guideを参照してください。この のJava API の例があります。その変更により、そこに sleep() を含める必要はなくなります。インデックスの再計算が指定されたレベルに達すると、システムは自動的にクエリ リクエストを処理します。

アプリケーションの他の場所でこれをどのように使用しているかに応じて、いずれかの一貫性レベルが必要になる場合があります。

于 2016-01-25T21:17:39.753 に答える