1

只是想从遇到类似问题的任何人那里获得一些想法,以及你们是如何提出解决方案的。

基本上,我们在 RavenDB 中存储了大约 10K 文档。我们需要允许用户对这些文档执行过滤和搜索的能力。我知道 RavenDb 中的最大页面大小为 1024。因此,为了使过滤器和搜索能够正常工作,我需要自己进行分页。但我的解决方案给了我以下错误:

已达到此会话允许的最大请求数 (30)。

我尝试了许多不同的方法来处理会话,方法是将其包装在using关键字周围,并Dispose在每次调用 RavenDb 后显式调用,但均未成功。

有谁知道如何解决这个问题?这种情况的最佳做法是什么?

var pageSize = 1024;
var skipSize = 0;
var maxSize = 0;

using (_documentSession)
{
    maxSize = _documentSession.Query<LogEvent>().Count(); 
}                                   

while (skipSize < maxSize)
{
    using (_documentSession)
    {
        var events = _documentSession.Query<LogEvent>().Skip(skipSize).Take(pageSize).ToList();

        _documentSession.Dispose();             

        //building finalPredicate codes..... which i am not providing here....

        results.AddRange(events.Where(finalPredicate.Compile()).ToList());

        skipSize += pageSize;
    }  
}
4

1 回答 1

1

Raven 将请求(加载、查询、...)的数量限制为每个会话 30 个。此行为已记录在案

我可以看到您在代码中处理了会话。但是我看不到您在哪里重新创建会话。无论如何,以您打算执行的方式加载数据并不是一个好主意

我们正在使用索引和分页,并且从不加载超过 1024。

如果您期望有数千个文档,或者您的精确逻辑不能用作索引,并且您不关心查询需要多长时间,请使用无界结果 API

var results = new List<LogEvent>();
var query = session.Query<LogEvent>();

using (var enumerator = session.Advanced.Stream(query))
{
    while (enumerator.MoveNext())
    {
        if (predicate(enumerator.Current.Document)) {
            results.Add(enumerator.Current.Document);
        }
    }
}

根据文档的数量,这将使用大量 RAM。

于 2014-11-06T10:48:30.400 回答