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。我做了一个实验:

  • 我插入一个User,然后找到一个findById,我得到了一个我正确插入的用户。

  • 我插入,然后我立即使用findAll,它返回空。

  • 我插入,延迟 3 秒,然后使用findAll,我可以找到我插入的那个。

由此,我怀疑 N1qlQuery 只搜索缓存层而不是“持久”层。那么,我怎样才能强制让它在“持久”层上搜索呢?

4

2 回答 2

3

在带有 N1QL 的 Couchbase 4.0 中,您可以在查询时指定不同的一致性级别,这些级别对应于通过索引重新计算传播的更新/更改的不同成本。这些与数据是否持久化无关,而是在您发出查询时的一个选项。默认值为“无界”,为了确保您的 upsert 请求被考虑在内,您需要将此查询作为“request plus”发出。

为了获得您正在寻找的效果,您需要在创建 N1qlQuery 时添加 N1qlPararms,方法是使用另一种形式的 simple() 方法。使用 ScanConsistency.REQUEST_PLUS 添加N1qlParams您可以在Couchbase 的开发人员指南中阅读更多相关信息。有一个Java API 示例。通过该更改,您将不需要在其中设置 sleep(),一旦索引重新计算达到您指定的级别,系统将自动为查询请求提供服务。

根据您在应用程序中其他地方的使用方式,有时您可能需要任一一致性级别。

于 2016-01-25T21:17:39.753 回答
2

您需要更强的扫描一致性。将 N1qlParam 添加到查询中,使用consistency(ScanConsistency.REQUEST_PLUS)

于 2016-01-25T21:09:18.683 回答