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