【发布时间】:2015-01-02 10:25:56
【问题描述】:
只是想从遇到类似问题的人那里得到一些想法,以及你们是如何想出解决方案的。
基本上,我们在 RavenDB 中存储了大约 10,000 个文档。我们需要允许用户对这些文档执行过滤和搜索的能力。我知道 RavenDb 中的最大页面大小为 1024。因此,为了使过滤器和搜索能够正常工作,我需要自己进行分页。但我的解决方案给了我以下错误:
已达到此会话允许的最大请求数 (30)。
我尝试了许多不同的方法来处理会话,方法是将其包装在 using 关键字周围,并在每次调用 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;
}
}
【问题讨论】:
-
andrew 您的用户是否需要能够在一个视图中查看超过 1024 个文档?你能发布代码来显示你的
_documentSession是如何创建的吗? -
我还注意到你在这条线上调用
ToList()var events = _documentSession然后你的条件将被应用。您应该尝试将过滤器向下传递给查询。 -
好点,这将优化查询。但我认为它实际上并不能解决根本问题。
-
有一些方法可以绕过请求限制 (30),但它的存在只是为了鼓励开发人员更多地考虑手头的问题。您仍然没有回复客户是否需要在单个视图中提供超过 1024 个文档? (即同一会话)- 基本上,框架鼓励您将结果分页给客户端(默认情况下页面大小为 128,但如果需要,则最多为 1024)
-
对于客户端视图,我们不需要一次显示 1024 个文档。如果 Raven 想要鼓励开发人员进行分页,那么它不应该只对前 1024 个文档应用我们的谓词而忽略其余的。示例: _documentSession.Query
().Where(finalPredicate.Compile()).ToList() 。如果您有与谓词匹配的记录并且它们位于 2045,则该查询不会返回它。
标签: session filtering ravendb page-size custompaging