14

我有一个应用程序:

  • 使用嵌入式 RavenDB 数据库
  • 使用单调读取选项
  • 使用静态索引

我注意到,当应用程序启动时,索引都是暂时过时的,即使在应用程序关闭(干净地)前一次运行时它们不是过时的。

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

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

我的问题是:

  1. 我的假设是错误的/愚蠢的吗?
  2. 有没有办法防止这种情况发生?
  3. 这种行为只是一个开始的事情,还是可能随时发生?例如,我是否可以渲染 10 个结果,然后刷新 0 个结果,然后再次刷新 10 个结果,因为 Raven 决定要重新索引所有内容?
4

1 回答 1

1

为了回答您的问题,

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

不,据我了解,您的假设是正确的,您可能会看到陈旧的结果,但不应看到陈旧结果,除非索引是在 T & T+1 之间从头开始重建的,并且您在索引重置后立即点击它。

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

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

如果所有其他方法都失败了,您可能需要一个进程阻塞,直到所有索引(或您关心的索引)都是新鲜的,然后再继续应用程序启动过程的其余部分。

这种行为只是一个开始的事情,还是可能随时发生?例如,我是否可以渲染 10 个结果,然后刷新 0 个结果,然后再次刷新 10 个结果,因为 Raven 决定要重新索引所有内容?

是的,如果索引被重置,这是可能的,但据我所知,只有通过 API 或管理工作室手动触发才会发生(启动后)。

于 2013-07-01T02:13:42.797 回答