【问题标题】:Load Full Collection in RavenDB在 RavenDB 中加载完整集合
【发布时间】:2014-09-02 17:46:06
【问题描述】:

在使用 RavenDB 的应用程序启动时,我需要加载特定类型的文档的完整集合并循环遍历它们。文档的数量应始终很小(

我可以通过:

session.Query<MyType>();

但我想确保我得到的结果立即一致。

似乎这种情况介于Load()Query() 之间,因为(我认为)查询旨在最终保持一致,而负载旨在立即保持一致?

但在这种情况下,应该不涉及索引(不过滤或排序),那么使用Query() 会立即一致吗?

【问题讨论】:

    标签: c# ravendb eventual-consistency


    【解决方案1】:

    Query()总是立即不一致session.SaveChanges() 仅存储到文档存储。索引总是在以后异步更新,尽管在大多数情况下非常非常快!

    这通常是一个糟糕的建模设计和文档数据库的代码味道。由于您提到的是在应用程序启动时并且数量相对较少,因此这听起来像是不经常更改的参考信息。您能否将所有这些都包含在包含List&lt;MyType&gt; 的单个文档中?

    如果做不到这一点,你可以试试LoadStartingWith() 命令,它仍然是完全的 ACID,并给它一个适合所有必要文件的前缀,虽然最多 1000 仍然很多,我不知道那个方法将返回所有结果或在某个时候将其切断。

    如果您必须使用Query(),则必须使用.WaitForNonStaleResults() 的变体之一(其他变体考虑到您正在等待的内容,而不是要求所有索引都是完整)以获得一致的结果,但如果文档不经常更改,那应该是相当安全的。虽然我真的很讨厌以几乎所有形式使用这种方法,但更喜欢使用上述任何一种更可取的方法。

    【讨论】:

    • 谢谢大卫。第一个选项很难——我最初是这样的,但遇到了并发问题。我可能不得不等待非陈旧的结果(我同意这并不理想)。没有排序和谓词的 Query() 使用什么索引?每种文档类型是否有某种基线索引?
    • 服务器将为未即时指定的查询构建临时索引。这意味着当你第一次使用它时,它会得到陈旧的结果,或者如果你指定了 WaitFor,它会在构建它的过程中等待相当长的时间。服务器最终会自行将使用良好的临时索引提升为完整索引,并删除不再使用的临时索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多