【问题标题】:Querying RavenDb with max 30 requests error使用最多 30 个请求错误查询 RavenDb
【发布时间】: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


【解决方案1】:

Raven 将请求(加载、查询、...)的数量限制为每个会话 30 个。这种行为是documented

我可以看到您在代码中处理了会话。但是我看不到您在哪里重新创建会话。无论如何,您打算按照他们的方式加载数据是not a good idea

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

如果您期望有数千个文档,或者您的精确逻辑不能用作索引,并且您不关心查询需要多长时间,请使用 unbounded results 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多