【问题标题】:MongoDB : Why should we close the cursor after it is used?MongoDB:为什么我们要在使用后关闭游标?
【发布时间】:2014-08-07 06:44:21
【问题描述】:

我看到人们在使用后关闭光标。我还在文档中读到服务器在 10 分钟不活动后关闭光标。

我在网上搜索但没有找到正确的答案。我是数据库和 MongoDB 的新手。

为什么需要关闭光标?

【问题讨论】:

    标签: mongodb memory-leaks mongodb-query database-cursor


    【解决方案1】:

    只有在您没有“耗尽”结果时才真正需要关闭光标。或者换句话说,遍历游标返回的所有可能结果。

    让“光标”处于打开状态就像是留下一个永远不会被重复使用的打开连接。这些东西不是免费的。事实上,标准连接成本是 1MB(大约)。因此,如果您留下大量“部分迭代”的游标,那么在活动连接和内存使用方面都会产生一般开销。

    如果实际上您实际上总是迭代“所有”结果(其中包括一个“限制”,即“光标修饰符”),那么光标将关闭并且一切正常。

    一般用法是通过查看所有结果来实际耗尽/耗尽光标。因此没有明确的需要销毁。

    【讨论】:

      【解决方案2】:

      这取决于您的使用情况,但至少在我的 Web 应用程序中 - 客户端处理关闭。 为什么?因为我的 Web 应用程序遵循短且无状态的请求处理模式(您从浏览器获得请求,快速构建 HTTP 响应 - 不到一秒 - 此响应依赖于 mongo 数据)。所以我的客户端只需要 1 秒的连接。

      现在,考虑一下,如果我每分钟有(比如说)50 个请求……我的服务器可以轻松地处理它们。但是,如果每个请求都保留资源 10 分钟,它就会崩溃……例如9 分钟后,我将拥有 450 个不必要的开放资源...

      【讨论】:

      • 但是光标不是和你的上下文同时关闭吗?除非你一直使用 context.Background(),但是如果你使用 Request 的 Ctx 呢?
      猜你喜欢
      • 2017-03-06
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 2016-05-07
      • 2011-05-31
      • 2010-09-22
      相关资源
      最近更新 更多