==============
== ACE BLOG ==
==============

Mongo 游标丢失的解决办法

有一些场景需要长时间遍历 MongoDB 的游标获取数据处理,当处理逻辑时间太长或者一些其他原因导致下一次从 Mongo 服务器读取数据的时间超过 30 分钟,就会报错 cursor 不存在,比如下面的示例

pymongo.errors.CursorNotFound: cursor id 436510073125446919 not found

原因是长时间没有从 Mongo 中读取数据,Mongo 服务端对超过 30 分钟的 session 会清理,清理了 session 游标 cursor 自然也会失效。

解决办法:

查询方法调用增加 no_cursor_timeout 保证游标本身不会过期, 另外自行开启一个 session, 查询方法指定 session 为刚刚创建的 session, 然后定期对 session 使用命令 refreshSessions 进行刷新操作。这样 session 就不会过期了,cursor 有 no_cursor_timeout 的参数也不会过期, 即使忘记关闭 cursor 也不要紧, 只要代码结束停止了对 session 的刷新操作,最多 30 分钟后依然会被回收。 推荐阅读官网文档 cursor.maxTimeMS