在启动使用RavenDB的应用程序时,我需要加载特定类型的完整文档集并循环遍历它们。文件数量应始终很小(<1000)。
我可以通过以下方式完成此任务:
session.Query<MyType>();
但我想确保我得到的结果立即一致。
这种情况似乎介于Load()
和Query()
之间,因为(我认为)该查询最终是一致的,并且负载是立即一致的?
但是在这种情况下,不应该涉及索引(没有过滤或排序),那么使用Query()
会立即保持一致吗?
答案 0 :(得分:2)
Query()
总是立即不一致。 session.SaveChanges()
仅存储到文档存储区。索引总是在以后异步更新,尽管大部分都非常快!
这通常是一个糟糕的建模设计和带有文档数据库的代码味道。由于您提到应用程序启动时的数量相对较少,因此它听起来像参考信息不经常更改。您是否可以将所有这些内容包含在包含List<MyType>
的单个文档中?
如果失败了,您可以尝试LoadStartingWith()
命令,它仍然是完全ACID,并为其提供适合所有必要文档的前缀,尽管最多1000个仍然很多而且我不会知道该方法是否会返回所有结果或在某个时刻切断它。
如果您必须使用Query()
,则必须使用.WaitForNonStaleResults()
的其中一种变体(其他变体会考虑您正在等待的内容而不是要求所有索引都是完整的)以获得一致的结果,但如果文档不经常更改,这应该是相当安全的。虽然我真的很讨厌几乎所有形式都使用这种方法,但更喜欢使用上述更优选的方法。