设置noCursorTimeout后,仍未找到mongo光标

时间:2018-09-12 13:14:15

标签: java mongodb

我不断从Java mongodb客户端获取以下异常:

由以下原因引起:com.mongodb.MongoCursorNotFoundException:查询失败,错误代码为-5,并且服务器server1:27017上出现错误消息“在服务器server1:27017上没有找到Cursor 105639140478”

代码如下:

MongoCollection<Document> db = (bunch of code to load up one of these objects)
FindIterable<Document> cur = db.find().projection(desiredFields).noCursorTimeout(true);
MongoCursor<Document> cursor = cur.iterator();
while(cursor.hasNext()) {
    Document o = cursor.next();
    doStuff(o);
}

我已经设置了noCursorTimeout,但是我仍然遇到异常。它在超时之前会处理大约110,000条记录,因此它显然能够进行排序(否则它将不处理任何记录),但同时也无法正常工作,因为我希望它在超时后不会超时专门设置noCursorTimeout(true)。

1 个答案:

答案 0 :(得分:0)

来自在线文档:

如果会话空闲时间超过30分钟,则MongoDB服务器会将会话标记为已过期,并可以随时关闭它。当MongoDB服务器关闭会话时,它还会终止所有正在进行的操作并打开与该会话关联的游标。这包括使用noCursorTimeout或maxTimeMS大于30分钟配置的游标。

建议的解决方案是减小批量大小或手动刷新会话

对于返回游标的操作,如果游标可能闲置了30分钟以上,请在显式会话中使用Session.startSession()发出操作,并使用refreshSessions命令定期刷新会话

记录不充分,所以这里有个例子:

BsonDocument sid = client.startSession().getServerSession().getIdentifier();

在迭代器循环内

database.runCommand(new Document("refreshSessions",List.of(sid)));