当mongodb游标过期时

时间:2014-02-18 12:02:29

标签: mongodb

我不了解mongodb,我只是想问一下是否有可能,如果可能的话,我该怎么做。我的问题是我们怎么知道游标何时到期。是否有用于此目的的API?

对于任何意见和建议,我将不胜感激。

祝你好运。

3 个答案:

答案 0 :(得分:5)

来自MongoDB文档:

默认情况下,当客户端耗尽游标中的所有结果时,MongoDB将自动关闭游标。但是,对于上限集合,您可以使用在客户端在初始游标中耗尽结果后保持打开的Tailable Cursor。

http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/

可能导致游标过期的其他因素是batchSize和timeout。总结一下光标到期的因素是:

答案 1 :(得分:1)

通常,光标在一段时间(大约10分钟)后在数据库服务器上“死”,并在客户端耗尽所有结果时关闭。

某些驱动程序有一个“不朽”选项,它在设置NoTimeout选项的Java驱动程序中具有相同的功能:

dbcoll.find(...).addOption(Bytes.QUERYOPTION_NOTIMEOUT) 

如果您打算在这段时间内保持打开的光标,请按上述方式设置。

http://api.mongodb.org/java/current/com/mongodb/Bytes.html#QUERYOPTION_NOTIMEOUT

答案 2 :(得分:1)

我遇到了这个帖子,正在寻找pymongo CursorNotFound: Cursor not found, cursor id中出现以下错误的解决方案。显然原因与此线程相同,但没有为pymongo提供解决方案。

在pymongo文档中的常见问题解答中,以下链接回答了问题:herehere

最快的解决方案是禁用超时,因此服务器不会使光标到期,并且它始终有效。

client = MongoClient("localhost")
db = client.testdatabase
cursor = db.testcollection.find({}, no_cursor_timeout=True)

find()文档中,您可以通过更改光标类型找到备选方案:

  

cursor_type(可选):要返回的游标类型。有效   选项由CursorType定义:

     
      
  • NON_TAILABLE - 此查找调用的结果将在结果集上返回标准光标。
  •   
  • TAILABLE - 此查找调用的结果将是一个tailable游标 - tailable游标仅用于上限集合。当检索到最后一个数据但它们保持打开状态时,它们不会关闭   光标位置标记最终文档位置。如果有更多数据   收到的光标迭代将从最后一个文件继续   接收。有关详细信息,请参阅tailable游标文档。
  •   
  • TAILABLE_AWAIT - 此查找调用的结果将是一个设置了await标志的tailable游标。服务器将等待几秒钟   返回完整的结果集后,它可以捕获并返回   在查询期间添加了其他数据。
  •   
  • EXHAUST - 此查找调用的结果将是一个排气光标。 MongoDB将批量处理的结果流式传输到客户端而无需等待   客户端请求每批次,减少延迟。见附注   兼容性如下。
  •   

更新:使用no_cursor_timeout后,我想知道光标未执行时会发生什么。这是答案:PyMongo: What happens to cursor when no_cursor_timeout=True