我在内存模式下使用RavenDB进行单元测试.我的查询由静态索引支持.我没有使用WaitForNonStaleResults()API(也不想).
测试的典型工作流程是:
>在内存模式下初始化RavenDB
>使用IndexCreation.CreateIndexes(Assembly,IDocumentStore)集成索引
>插入测试数据(用于验证查询行为)
>运行查询
>验证查询输出
我注意到第1-3步发生得很快,静态索引没有时间在第4步之前进行更新,因此索引是陈旧的.
while (documentStore.DocumentDatabase.Statistics.StaleIndexes.Length != 0) Thread.Sleep(10);
这感觉很麻烦我想知道的是:
>在内存模式下运行RavenDB时,索引出现故障是否正常?
>在测试过程中是否有更好的方法来避免陈旧的索引?
解决方法
交叉发布到
RavenDB usergroup,并有一个工作的解决方案.
Is it normal for indexes to be stale when running RavenDB in In-Memory
mode?
是.索引是索引.
Is there a better way to avoid stale indexes during testing?
是.在初始化文档存储时配置全局约定:
var store = new EmbeddableDocumentStore(); store.RunInMemory = true; store.Conventions = new DocumentConvention { DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites }; store.Initialize();
注意:ConsistencyOptions.QueryYourWrites不适用于Map / Reduce索引,即使用Reduce => … 部分.对于这些,您必须在查询时使用自定义(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(); } }