应用程序启动时的RavenDB和过时索引

应用程序启动时的RavenDB和过时索引,ravendb,eventual-consistency,Ravendb,Eventual Consistency,我有一份申请: 使用嵌入式RavenDB数据库 使用单调读取选项 使用静态索引 我注意到,当应用程序启动时,索引都是暂时过时的,即使在应用程序关闭(干净地)上一次运行时它们没有过时 例如,我运行应用程序,插入10条记录,然后等待索引更新。我查询它并看到我期望的结果。然后我关闭应用程序,再次启动,然后进行查询,但没有得到任何结果。一秒钟后,索引已经更新,我现在可以得到结果了。如果我重复这个,有时我得到10个结果,有时0个结果,有时2个结果 我的假设是,当在时间T查询索引时,我总是会在T+1处看

我有一份申请:

  • 使用嵌入式RavenDB数据库
  • 使用单调读取选项
  • 使用静态索引
我注意到,当应用程序启动时,索引都是暂时过时的,即使在应用程序关闭(干净地)上一次运行时它们没有过时

例如,我运行应用程序,插入10条记录,然后等待索引更新。我查询它并看到我期望的结果。然后我关闭应用程序,再次启动,然后进行查询,但没有得到任何结果。一秒钟后,索引已经更新,我现在可以得到结果了。如果我重复这个,有时我得到10个结果,有时0个结果,有时2个结果

我的假设是,当在时间T查询索引时,我总是会在T+1处看到“至少一致”的结果。但是,如果服务器在此期间重新启动,我似乎会在T+1处看到不太一致的结果。这不是最终的一致性,而是最终的不一致性!:)

我的问题是:

  • 我的假设是错的/愚蠢的吗
  • 有没有办法防止这种情况发生
  • 这种行为只是一种启动,还是可能随时发生?例如,我可以渲染10个结果,然后刷新0个结果,然后在下一次刷新时再次渲染10个结果,仅仅因为Raven决定要重新索引所有内容吗
    为了回答你的问题

    我的假设是错的/愚蠢的吗

    不,据我所知,您的假设是正确的,您可能会看到过时的结果,但不应该看到不太过时的结果,除非索引是在t&t+1之间从头开始重建的,并且您在索引重置后刚好命中它

    有没有办法防止这种情况发生

    我所知道的唯一方法是确保索引完全关闭。索引文件夹中通常会留下一些锁定文件,指示情况是否如此。Raven的调试级别日志将指示是否也启动了重建

    如果所有其他操作都失败了,您可能需要有一个进程,在继续应用程序启动过程的其余部分之前,该进程会一直阻塞,直到所有索引(或您关心的索引)都是新的

    这种行为只是一种启动,还是可能随时发生?例如,我可以渲染10个结果,然后刷新0个结果,然后在下一次刷新时再次渲染10个结果,仅仅因为Raven决定要重新索引所有内容吗


    是的,如果索引被重置,这是可能的,但据我所知,只有通过API或management studio手动触发时才会发生(启动后)

    哪个版本的raven?@ThomasJames 2.5.2621您在内存中运行吗?这些是临时索引吗?不在内存中,静态索引不存在,除了内置索引之外没有包。