我在In-Memory模式下使用RavenDB进行单元测试。我的查询由静态索引支持。我没有使用WaitForNonStaleResults()
API(我也不想)。
测试的典型工作流程是:
IndexCreation.CreateIndexes(Assembly, IDocumentStore)
我注意到步骤1-3发生得太快,静态索引没有时间在步骤4之前得到更新 - 因此索引是陈旧的。
我为此创建了一个快速的解决方案。在第3步之后,我执行:
while (documentStore.DocumentDatabase.Statistics.StaleIndexes.Length != 0)
Thread.Sleep(10);
这感觉很麻烦。我想知道的是:
答案 0 :(得分:14)
将此交叉发布到RavenDB usergroup,并提供有效的解决方案。
在In-Memory中运行RavenDB时索引是否过时是否正常? 模式?
是。索引是索引。
在测试期间是否有更好的方法来避免过时的索引?
是。初始化文档存储时配置全局约定:
var store = new EmbeddableDocumentStore();
store.RunInMemory = true;
store.Conventions = new DocumentConvention
{
DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites
};
store.Initialize();
注意: ConsistencyOptions.QueryYourWrites
不适用于Map / Reduce索引,即带有Reduce => ...
部分的索引。对于这些,您必须在查询时使用Customize(x => x.WaitForNonStale...())
更新:有another approach,可能会更好(尚未亲自尝试过)。您可以实现IDocumentQueryListener以强制所有查询返回非陈旧结果:
var store = new EmbeddableDocumentStore { RunInMemory = true };
store.Initialize();
store.RegisterListener(new ForceNonStaleQueryListener());
public class ForceNonStaleQueryListener : IDocumentQueryListener
{
public void BeforeQueryExecuted(IDocumentQueryCustomization customization)
{
queryCustomization.WaitForNonStaleResults();
}
}