MongoDB 游标超时解决办法(cursor id is not valid at server)

你在用 db.collection.find() 的时候,它返回的不是所有的数据,而实际上是一个“cursor”。它的默认行为是:第一次向数据库查询 101 个文档,或 1 MB 的文档,取决于哪个条件先满足;之后每次 cursor 中的文档用尽后,查询 4 MB 的文档。另外,find() 的默认行为是返回一个 10 分钟无操作后超时的 cursor。如果我一个 batch 的文档十分钟内没处理完,过后再处理完了,再用同一个 cursor id 向服务器取下一个 batch,这时候 cursor id 当然已经过期了,这也就能解释为啥我得到 cursor id 无效的错误了。

Stack Overflow 上有人提出过解决方法,是在 find() 时传入 timeout=False 来禁用 10 分钟超时的保护措施。但是我觉得这是非常差的办法,因为如果你循环时产生异常,甚至断电或断网,都会导致 MongoDB 服务器资源永远无法被释放。而更好的办法是(我也发在了 Stack Overflow 上),估计一个 batch 大小,让 MongoDB 客户端每次抓取的文档在 10 分钟内能用完,这样客户端就不得不 10 分钟内至少联系服务器一次,保证 cursor 不超时。

具体用法:

for document in db.collection.find().batch_size(30):
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java与MongoDB集成的方式有很多,其一种常用的方法是使用MongoDB的Java驱动程序来进行游标查询。 游标查询是一种在MongoDB用于获取大量数据的一种方式。与传统的查询方式不同,游标查询并不是一次性获取全部数据,而是按需获取数据,可以减轻对内存的开销。 在Java使用游标查询,首先需要导入MongoDB的Java驱动程序包。然后,我们可以使用以下代码示例来进行游标查询: ``` // 创建MongoDB链接 MongoClient mongoClient = new MongoClient("localhost", 27017); // 获取数据库 MongoDatabase database = mongoClient.getDatabase("myDatabase"); // 获取集合 MongoCollection<Document> collection = database.getCollection("myCollection"); // 创建查询 Document query = new Document("name", "John"); // 执行查询 FindIterable<Document> cursor = collection.find(query); // 遍历游标结果 for (Document document : cursor) { System.out.println(document); } // 关闭游标和连接 cursor.close(); mongoClient.close(); ``` 在上面的代码,我们首先创建了一个MongoDB的链接,然后获取了要查询的数据库和集合。接着,我们创建了一个查询文档,并通过`collection.find(query)`方法执行查询,得到一个游标。然后,我们可以使用`for`循环遍历游标的结果,并对每个结果进行相应的处理。最后,我们需要手动关闭游标和关闭MongoDB的链接。 游标查询是一种非常灵活和高效的查询方式,可以处理大量的数据。但是需要注意的是,在使用游标查询时,要避免返回大量的数据,以免对内存造成过大的压力。对于需要返回大量数据的情况,可以考虑使用分页查询的方式来进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值