我不断从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)。
答案 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)));