我正在使用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切点,当超时异常抛出时,我们可以做些什么来改变查询稳定索引并返回过时结果?
答案 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();
}