Indexing RavenDB:最好的方法是先等待非陈旧索引,然后在超时时查询陈旧索引
我用的是Ravendb2.5。我的情况是,我需要先等待none-stale索引,如果15秒后超时,则查询stale索引,而不是抛出超时异常。这是我的密码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
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索引,而不是抛出超时异常。