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

时间:2013-12-06 05:49:43

标签: indexing ravendb

我正在使用Ravendb 2.5。我有这种情况,我需要先等待非陈旧的索引,如果它在15秒后超时,查询陈旧的索引而不是抛出超时异常。这是我的代码。

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

我需要添加扩展方法以使上述代码适用于所有查询,例如:     public static List ToList(此IRavenQueryable可查询)

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

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

ravendb是否有一个AOP切点,当超时异常抛出时,我们可以做些什么来改变查询稳定索引并返回过时结果?

2 个答案:

答案 0 :(得分:1)

根据您的要求,我希望将此作为来自最终用户客户端的两个单独调用。首先发出查询而不等待非陈旧结果,立即向最终用户显示查询结果。如果结果是陈旧的,那么让最终用户可以看到它,并对服务器进行第二次查询,等待非陈旧结果。

这样终端用户总能快速看到一些东西,而不必等待15秒,即使是过时的结果。

答案 1 :(得分:0)

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

documentStore.Conventions.DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites;

注意:如果索引非常繁忙或者您向DB写入内容并立即查询相关数据,则使用async而不是timeout会更好。

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