当前位置: 首页 > 知识库问答 >
问题:

长时间运行的查询循环中的mongo MongoCursorNotFoundException

廉博赡
2023-03-14

我有一个简单的查询循环,它在大约93分钟内处理了96,945个文档中的44,000个文档后获得一个MongoCursorNotFoundException。

MongoIterable<MasterDocument> query = masterCollection.find().noCursorTimeout(true);
    for (MasterDocument masterDocument : query) { ... do some stuff ... }

“做一些事情”部分需要一段时间,这就是为什么整个循环需要这么长时间的原因。

我的问题是,在处理集合中可能一半的文档后,我会得到这个html" target="_blank">异常。

我正在Windows10笔记本电脑上本地运行客户端应用程序和mongod服务器,通过localhost访问服务器。

服务器日志显示了大量类似于以下内容的消息:

{"t":{"$date":"2021-01-04T20:21:35.510-08:00"},"s":"I",  "c":"COMMAND",  "id":51803,   "ctx":"conn27","msg":"Slow query","attr":{"type":"command","ns":"master_database.MasterCollection","command":{"find":"MasterCollection","filter":{"hashCode":1753339282},"$db":"master_database","lsid":{"id":{"$uuid":"6a252f51-2c6e-4c01-ae03-1a80aab109e0"}}},"planSummary":"COLLSCAN","keysExamined":0,"docsExamined":96944,"cursorExhausted":true,"numYields":96,"nreturned":0,"queryHash":"DBC59907","planCacheKey":"DBC59907","reslen":121,"locks":{"ReplicationStateTransition":{"acquireCount":{"w":97}},"Global":{"acquireCount":{"r":97}},"Database":{"acquireCount":{"r":97}},"Collection":{"acquireCount":{"r":97}},"Mutex":{"acquireCount":{"r":1}}},"storage":{},"protocol":"op_msg","durationMillis":147}}

这些消息的最后一条后面是:

{"t":{"$date":"2021-01-04T20:21:35.521-08:00"},"s":"I",  "c":"NETWORK",  "id":22944,   "ctx":"conn27","msg":"Connection ended","attr":{"remote":"127.0.0.1:58990","connectionId":27,"connectionCount":14}}

{“T”:{“$Date”:“2021-01-04T20:21:35.522-08:00”},“S”:“i”,“C”:“Network”,“ID”:22944,“CTX”:“Conn26”,“Msg”:“Connection Ended”,“ATTR”:{“Remote”:“127.0.0.1:58989”,“ConnectionID”:26,“ConnectionCount”:13}}{“T”:{“$Date”:“2021-01-04T20:21:35.922-08:00”},“S”:“i”,“C”:“-”,“ID”:20883,“CTX”

我试过:

  • 在查询游标上使用“nocursortimeout(true)”(如上图所示)
  • 使用“Mongod--SetParameter LocalLogicalSessionTimeoutMinutes=240”启动服务器。最后一个结果似乎导致了其他日志消息显示“错误”:“Location13111:field(expireAfterSeconds)long!=int”

我正在使用mongod 4.4和最新的mongo Java API。

共有1个答案

汪德寿
2023-03-14

您可能需要在所有碎片和Mongo中将默认光标空闲超时增加到更大的值:

检查参数(默认值为10 min=600000 ms):

use admin
db.runCommand({getParameter:1, cursorTimeoutMillis: 1})

并更新到更大的值:

use admin
db.runCommand({setParameter:1, cursorTimeoutMillis: 600000000 })

日志中的COLSCAN也表明您在查询中不使用索引,也许您需要在“hashcode”上创建一个...

 类似资料:
  • 问题内容: 说我长时间运行更新查询 some_table中的modification_time的值是什么?它们是相同还是不同(例如,执行查询花了2天的时间)。 如果它们不同,如​​何编写此查询以使它们都相同? 问题答案: 它们都是一样的,因为NOW()在查询开始时被锁定了。 答案太短了吗? 好的,更多信息有关NOW()的MySQL参考 NOW()返回一个 恒定时间 ,该时间指示该语句 开始执行的时

  • 我目前使用的是mysql 我有两个名为person和zim_list_id的表,这两个表都有超过200万行

  • 当我在查询浏览器和我的应用程序中运行相同的查询时,我会得到很大的时间差。查询浏览器运行查询只花了2秒。但在我的应用程序中,它需要20秒。实际上,我正在处理12L的记录。我使用的是sql server数据库,在我的应用程序中使用了本机sql(JDBC)API。我指的是natve语句和resultSet API来获取记录。我在这里复制了我的代码片段。 另外,我使用了相同的查询条件与相同的用户。 我的代

  • 我有一个类,其中我们将“两个时态对象之间的时间量”存储到一个长变量monthBt中,并将其用作“for循环”中的测试表达式。然而,我在azure sechub中收到中级安全警告“未检查循环条件的输入”。 验证和删除警告的最佳方法是什么?谢谢

  • 问题内容: 我有一个带有表的数据库,该表充满了用于检查另一个数据库的条件和错误消息。 我想运行一个循环,以便对照第二个数据库中的所有表检查所有这些条件,并生成一个给出错误的报告。 这是可能的ms访问。 例如, querycrit表 我有超过400个类似这样的不同变量的查询。 我针对其运行查询的表是 记录表 问题答案: 这是更多示例代码。它说明了两种不同类型的记录集的用法。您可能希望阅读VBA陷阱:

  • 有人能帮我弄清楚在Hibernate中运行本机查询和循环运行命名查询之间的区别吗?我搜索了很多论坛,但没有得到一个清晰的视图。 我在代码中遇到的问题是,有两个查询,一个名为本机查询,一个名为查询。因此,当我在Hibernate中循环迭代查询时,在命名的本机查询中,我一次又一次地得到具有相同值的实体作为结果,但在命名查询的情况下,我得到了具有不同值的不同实体。为什么会发生这种情况? 我使用的数据库是