Indexing RavenDB:最好的方法是先等待非陈旧索引,然后在超时时查询陈旧索引

Indexing RavenDB:最好的方法是先等待非陈旧索引,然后在超时时查询陈旧索引,indexing,ravendb,Indexing,Ravendb,我用的是Ravendb2.5。我的情况是,我需要先等待none-stale索引,如果15秒后超时,则查询stale索引,而不是抛出超时异常。这是我的密码 RavenQueryStatistics stats; var result = queryable.Statistics(out stats).Take(maxPageSize).ToList(); if (stats.IsStale) { try { return queryable.Customize(x

我用的是Ravendb2.5。我的情况是,我需要先等待none-stale索引,如果15秒后超时,则查询stale索引,而不是抛出超时异常。这是我的密码

RavenQueryStatistics stats;
var result = queryable.Statistics(out stats).Take(maxPageSize).ToList();
if (stats.IsStale)
{
    try
    {
        return queryable.Customize(x => x.WaitForNonStaleResultsAsOfLastWrite(TimeSpan.FromSeconds(15))).ToList();
    }
    catch (Exception)
    {
        return result;
    }
}
else
{
    return result;
}
我需要添加扩展方法以使上述代码适用于所有查询,例如: 公共静态列表列表(此IRavenQueryable可查询)

我可能还需要添加扩展方法来覆盖:.All(),.Any(),.Contains(),.Count(),.ToList(),.ToArray(),.ToDictionary(),.First(),.FirstOrDefault(),.Single(),.SingleOrDefault(),.Last(),.LastOrDefault()等

我想知道是否还有其他更好的解决办法。最佳做法是什么


ravendb是否有一个AOP切点,当超时异常抛出时,我们可以做一些事情来更改查询的稳定索引并返回陈旧的结果?

您可以强制文档存储始终等待最后一次写入,然后您可以使用查询,而无需自定义说明

documentStore.Conventions.DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites;
注意:如果索引非常繁忙,或者您向数据库写入了一些内容并立即查询相关数据,那么使用异步而不是超时将更好

//deal with very busy index
using (var session = documentStore.OpenAsyncSession())
{      
     var result = await session.Query<...>()
                   .Where(x => ...)
                   .ToListAsync();
}
//write then read
using (var session = documentStore.OpenAsyncSession())
{    
     await session.StoreAsync(entity);
     await session.SaveChangesAsync();  
     //query relative data of entity
     var result = await session.Query<...>()
                   .Where(x => ...)
                   .ToListAsync();
}
//处理非常繁忙的索引
使用(var session=documentStore.OpenAsyncSession())
{      
var result=wait session.Query()
.其中(x=>…)
.ToListAsync();
}
//先写后读
使用(var session=documentStore.OpenAsyncSession())
{    
wait session.StoreAsync(实体);
wait session.saveChangesSync();
//查询实体的相关数据
var result=wait session.Query()
.其中(x=>…)
.ToListAsync();
}

根据您的要求,我更愿意将此作为来自最终用户客户端的两个单独呼叫。首先在不等待非陈旧结果的情况下发出查询,立即向最终用户显示查询结果。如果结果是陈旧的,那么让最终用户可见,并向服务器进行第二次查询,在那里等待非陈旧的结果


这样,最终用户总是可以快速看到一些内容,而不必等待15秒,即使是过时的结果。

我以前使用过ConsistencyOptions.QueryYourWrites,但它存在性能问题,15秒后返回超时异常,因此我想使用更好的方法。这就是为什么我使用新的查询解决方案,首先等待none-stale索引,如果15秒后超时,则查询stale索引,而不是抛出超时异常。