Session 查询最多30个请求的RavenDb时出错

Session 查询最多30个请求的RavenDb时出错,session,filtering,ravendb,page-size,custompaging,Session,Filtering,Ravendb,Page Size,Custompaging,我只是想从遇到类似问题的人那里得到一些想法,以及你们是如何想出解决方案的 基本上,我们在RavenDB中存储了大约10000个文档。我们需要允许用户对这些文档进行过滤和搜索的能力。我知道RavenDb中的最大页面大小为1024页。因此,为了使过滤器和搜索能够工作,我需要自己进行分页。但我的解决方案给了我以下错误: 已达到此会话允许的最大请求数(30) 我尝试了许多不同的处理会话的方法,使用关键字将会话包装在周围,并在每次调用RavenDb后显式调用Dispose,但都没有成功 有人知道如何回避这

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

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

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

我尝试了许多不同的处理会话的方法,使用关键字将会话包装在
周围,并在每次调用RavenDb后显式调用
Dispose
,但都没有成功

有人知道如何回避这个问题吗?这种情况下的最佳实践是什么

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;
    }  
}
var pageSize=1024;
var skipSize=0;
var maxSize=0;
使用(_documentSession)
{
maxSize=\u documentSession.Query().Count();
}                                   
while(skipSize
Raven将每个会话的请求数(加载、查询等)限制为30。这种行为是不公平的

我可以看到您在代码中处理了会话。但我看不出你在哪里重新创建会话。无论如何,他们加载数据的方式是你们想要做的

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

如果您期望有数千个文档,或者您的精确逻辑不能作为索引工作,并且您不关心查询将使用该索引多长时间

var results=newlist();
var query=session.query();
使用(var枚举器=session.Advanced.Stream(查询))
{
while(枚举数.MoveNext())
{
if(谓词(枚举数.Current.Document)){
结果.Add(枚举器.Current.Document);
}
}
}

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

andrew您的用户是否需要在单个视图中查看1024个以上的文档?你能发布显示你的
\u documentSession
是如何创建的代码吗?我注意到你在这一行调用
ToList()
var events=\u documentSession
这将优化查询。但我认为,它实际上并不能解决根本问题。有一些方法可以绕过请求限制(30),但它的存在只是为了鼓励开发人员更多地考虑手头的问题。您仍然没有回答是否需要在客户端的单个视图中包含1024个以上的文档?(即同一个会话)-基本上,框架鼓励您将结果分页到客户端(默认情况下,页面大小为128,但如果需要,最多为1024),对于客户端视图,我们不需要一次显示1024个文档。如果Raven希望鼓励开发人员进行分页,那么它不应该只对前1024个文档应用我们的谓词,而忽略其余的文档。示例:_documentSession.Query().Where(finalPredicate.Compile()).ToList()。如果您有与谓词匹配的记录,并且它们位于2045,那么该查询将不会返回这些记录。
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);
        }
    }
}