如何确保我的 N1QL 查询考虑最近的更改?
How to I make sure my N1QL Query considers recent changes?
我的情况是,给定以下 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
,它 returns 是空的。
我插入,延迟3秒,然后我使用findAll
,我可以找到我插入的那个。
据此,我怀疑 N1qlQuery 只搜索缓存层而不是 "persist" 层。那么,如何强制让它搜索"persist"层?
您需要更强的扫描一致性。使用 consistency(ScanConsistency.REQUEST_PLUS)
将 N1qlParam 添加到查询中
在带有 N1QL 的 Couchbase 4.0 中,您可以在查询时指定不同的 consistency levels 对应于 updates/changes 通过索引重新计算传播的不同成本。这些与数据是否持久化无关,而是您发出查询时的一个选项。默认值为 "not bounded" 并确保考虑到您的更新插入请求,您需要将此查询作为 "request plus".
发出
为了获得您正在寻找的效果,您需要使用 another form of the simple() method. Add a N1qlParams with ScanConsistency.REQUEST_PLUS. You can read more about this in Couchbase's Developer Guide. There's a Java API example of this 在创建的 N1qlQuery 中添加 N1qlPararms。通过该更改,您将不需要在其中设置 sleep(),一旦索引重新计算达到您指定的级别,系统将自动为查询请求提供服务。
根据您在应用程序其他地方使用它的方式,有时您可能需要任一一致性级别。
我的情况是,给定以下 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
,它 returns 是空的。我插入,延迟3秒,然后我使用
findAll
,我可以找到我插入的那个。
据此,我怀疑 N1qlQuery 只搜索缓存层而不是 "persist" 层。那么,如何强制让它搜索"persist"层?
您需要更强的扫描一致性。使用 consistency(ScanConsistency.REQUEST_PLUS)
在带有 N1QL 的 Couchbase 4.0 中,您可以在查询时指定不同的 consistency levels 对应于 updates/changes 通过索引重新计算传播的不同成本。这些与数据是否持久化无关,而是您发出查询时的一个选项。默认值为 "not bounded" 并确保考虑到您的更新插入请求,您需要将此查询作为 "request plus".
发出为了获得您正在寻找的效果,您需要使用 another form of the simple() method. Add a N1qlParams with ScanConsistency.REQUEST_PLUS. You can read more about this in Couchbase's Developer Guide. There's a Java API example of this 在创建的 N1qlQuery 中添加 N1qlPararms。通过该更改,您将不需要在其中设置 sleep(),一旦索引重新计算达到您指定的级别,系统将自动为查询请求提供服务。
根据您在应用程序其他地方使用它的方式,有时您可能需要任一一致性级别。