加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 测试过程中如何处理失效索引?

发布时间:2020-12-15 06:36:06 所属栏目:百科 来源:网络整理
导读:我在内存模式下使用RavenDB进行单元测试.我的查询由静态索引支持.我没有使用WaitForNonStaleResults()API(也不想). 测试的典型工作流程是: 在内存模式下初始化RavenDB 使用IndexCreation.CreateIndexes(Assembly,IDocumentStore)集成索引 插入测试数据(用于
我在内存模式下使用RavenDB进行单元测试.我的查询由静态索引支持.我没有使用WaitForNonStaleResults()API(也不想).

测试的典型工作流程是:

>在内存模式下初始化RavenDB
>使用IndexCreation.CreateIndexes(Assembly,IDocumentStore)集成索引
>插入测试数据(用于验证查询行为)
>运行查询
>验证查询输出

我注意到第1-3步发生得很快,静态索引没有时间在第4步之前进行更新,因此索引是陈旧的.

我为此创造了一个快速的解决方案.在第3步之后,我执行:

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();
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读