在RavenDB中WaitForNonStaleResultsAsOfNow的作用域是什么?
本文关键字:作用域 是什么 WaitForNonStaleResultsAsOfNow RavenDB | 更新日期: 2023-09-27 18:06:47
如果我在现有的RavenDB会话上运行以下查询:
var result = session.Query<Location>()
.Customize(x => x.WaitForNonStaleResultsAsOfNow())
.Where(l => l.Name = "Home" && !l.Deleted);
RavenDB等待哪些索引?我的假设是,它等待所有索引在查询时都是最新的;但是,这是否意味着如果在Location
上只有一个动态索引,而在其他表上有20个索引,我们总是等待21个索引更新?
如果您要在Fiddler查询期间查看数据库通信,或者像这样在查询中请求RavenQueryStatistics…
RavenQueryStatistics stats;
var result = session.Query<Location>()
.Customize(x => x.WaitForNonStaleResultsAsOfNow())
.Statistics(out stats)
.Where(l => l.Name = "Home" && !l.Deleted);
然后你会看到这样的属性:
- IsStale
- 时间戳-查询结果未过期的时间
- IndexName—正在查询的索引
- IndexTimestamp
- IndexEtag -索引 中最后更新的文档对应的文档版本
- 与分页等相关的其他事项
这是WaitFor(几个变量)用来确定是否应该满足的信息。
所以,TL;DR的答案是:只查询一个索引。检查所有索引是很浪费的。
对于WaitForNonStaleResultsAsOfNow,它说,抓取日期时间。现在,然后不返回结果,直到IndexTimestamp>=该日期。
这些WaitFor方法在某种程度上是一种反模式——你不应该完全依赖它们来获得一致的结果,你可能应该(在某些情况下,但不是全部)重新设计你的UI或你的数据模型,以便你在需要一致性的地方使用按文档id加载/存储(ACID是有保证的)。
但是,看看它是如何做到的,您可以看到使用WaitForNonStaleResultsAsOfLastWrite可能是一个更好的主意,它使Raven客户端注意到它存储的最后一个文档E-Tag,并等待该IndexETag被合并到索引中。对于"插入数据,然后在更新的网格中显示"的场景尤其如此。您不需要等待所有的索引完成,您只需要确保您刚刚插入的内容将出现