java - 如何确保我的 N1QL 查询考虑最近的更改?

标签 java scala caching couchbase n1ql

我的情况是,给定以下 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)))
  }

基本上就是insert,通过id找一个,findAll。我做了一个实验:

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

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

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

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

最佳答案

在带有 N1QL 的 Couchbase 4.0 中,有不同的 consistency levels您可以在查询时指定哪些更新/更改对应于通过索引重新计算传播的不同成本。这些与数据是否持久化无关,而是您发出查询时的一个选项。默认值为“无限制”,为了确保考虑到您的更新插入请求,您需要将此查询作为“请求加”发出。

要获得所需的效果,您需要使用 another form of the simple() method 在创建 N1qlQuery 时添加 N1qlPararms。 .添加一个带有 ScanConsistency.REQUEST_PLUS 的 N1qlParams .您可以在 Couchbase's Developer Guide 中阅读更多相关信息.有一个 Java API example of this .通过该更改,您将不需要在其中设置 sleep(),一旦索引重新计算达到您指定的级别,系统将自动为查询请求提供服务。

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

关于java - 如何确保我的 N1QL 查询考虑最近的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34998680/

相关文章:

scala - 如何在Scala中的列表中找到最大值的索引?

scala - 猫效应——独立效应的平行组合

iphone - 在移动 Safari (html5) 中缓存离线 iPhone/iPad Web 应用程序的视频内容?

Java Swing JTable 不可见

java - 关于友好号码的节目

java - 如何将Akka的监督策略与更具体的不可恢复错误处理结合起来?

mysql - 缓存与数据库查询

asp.net-mvc - ASP.NET MVC 缓存因 Controller 操作参数而异

java - 使用 jdbcTemplate 中的查询参数的结果集

java - 如何将 Firebase 数据与登录身份验证屏幕输入进行比较。安卓