2

我不断从我的 java mongodb 客户端收到以下异常:

原因:com.mongodb.MongoCursorNotFoundException:查询失败,错误代码 -5 和错误消息'Cursor 105639140478 not found on server1:27017' on server1:27017

代码如下:

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)。

4

1 回答 1

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)));
于 2020-10-29T05:24:46.573 回答