【问题标题】:QueryFailure flag was could not find cursor in cacheQueryFailure 标志在缓存中找不到游标
【发布时间】:2014-09-08 14:25:49
【问题描述】:

我在列出 MyCollection 所有文档时遇到以下错误:

MongoDB.Driver.MongoQueryException:无法使用 QueryFailure 标志 在 MyCollection 上找到 id 5389104123286064734 的缓存中的游标 (响应为 { "$err" : "在缓存中找不到 id 的游标 5389104123286064734 在集合 MyCollection", "code" : 16336 })

MyCollection 包含大约 24000 个文档,我正在使用 C# 的 MongoDB 驱动程序

注意:我有时会遇到这个异常,我再次执行相同的操作并且它正确响应!

能否解释一下这个错误,可能的原因是什么,如何避免?

非常感谢。

【问题讨论】:

    标签: mongodb mongodb-.net-driver mongodb-query


    【解决方案1】:

    错误表示服务器上不存在游标。这可能有几个原因。

    背景:mongodb 使用游标和游标 id 来跟踪您在结果集中的位置。它不会一次为您的查询传输所有文档,而是分批发送它们。迭代一个完整的批次后,驱动程序将返回一个 OP_GETMORE 以获取下一个批次。

    可能的问题:

    1. 您将花费 10 多分钟来迭代单个批次的结果。光标在 10 分钟后超时。解决此问题的最佳方法是指定较小的批次大小,例如每批次 20 个文档。

    2. 您正在使用不使用 ip 亲和性的负载平衡器后面的 mongos。如果负载均衡器在与原始查询不同的连接上接收到 OP_GETMORE 请求,则它可能会将 OP_GETMORE 发送到不同的服务器。

    【讨论】:

    • 您也可以增加(或禁用)超时时间,不是吗?
    • 感谢您的精彩回复。我尝试了第一个解决方案,将批量大小设置为 50,但它给出了相同的错误,然后我尝试了 20,它需要太多时间来响应!不知道是不是第二种情况,你知道怎么处理吗?
    • @I3arnon 我试图禁用光标超时,但我想知道增加/禁用光标超时有什么缺点吗?
    • 很遗憾,10 分钟超时是不可配置的。要么是 10 分钟,要么根本没有超时。这就是为什么减少批量大小实际上是同一件事的原因;少回来,客户端更快地迭代它们,更快地将 getmore 发送到服务器,更快地刷新超时。我不确定为什么较小的批量需要更长的时间来响应——这没有意义。顺便说一句:您是否为查询创建了索引?
    • 对我来说,解决方案是为我正在排序的列添加索引。
    猜你喜欢
    • 2015-03-31
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2012-09-06
    • 2022-08-06
    • 1970-01-01
    相关资源
    最近更新 更多