【问题标题】:MongoDB - open and close connection - advise for good practiceMongoDB - 打开和关闭连接 - 建议好的做法
【发布时间】:2016-12-28 16:14:20
【问题描述】:

我正在通过其 node.js 驱动程序使用 MongoDB

我通常在需要执行操作时打开连接(通过connect() 方法),并在完成后立即关闭它(通过close() 方法)。在我的程序中,很自然地,我需要对 MongoDB 执行许多操作,因此碰巧我打开和关闭了多次连接。

我想知道这是否是一个好习惯,或者在执行第一个操作时打开连接是否会更好,将其存储在一个变量中,并使用已经打开的连接进行以下操作,在程序结束时关闭它.

非常感谢任何建议。

【问题讨论】:

  • 你使用的是什么框架(node、python、c#)?
  • 我正在使用 node.js。谢谢
  • 我正在使用 node.js,我想知道连接池是否(以及如何)与 node.js 驱动程序一起工作。谢谢
  • 在每个操作/查询上打开和关闭连接也会在测试时产生非常可怕的开销,甚至比在生产中使用时还要糟糕。

标签: mongodb


【解决方案1】:

最好的做法是打开一次连接,将其存储在一个变量中并在最后关闭它。 MongoDB 明确建议这样做。这就是为什么打开和关闭连接是 MongoDB API 的一部分,而不是为每个查询自动发生。

为每个查询打开和关闭连接将在性能(CPU + 延迟)、网络流量、内存管理(创建和删除对象)方面引入大量开销,不仅对客户端而且对服务器本身而言,这也会影响其他客户。

关于连接的术语:在一些像Java这样的驱动程序中,实际创建和存储在变量中的不是物理连接,而是MongoClient实例。从抽象 (API) 的角度来看,它看起来像一个连接,但它实际上封装了实际的物理连接,并向用户隐藏了复杂性。

只创建一次MongoClient 实例,对于支持此操作的驱动程序,还可以让您受益于连接池,驱动程序为您维护并行的活动连接,以便您也只需要跨多个线程创建一个MongoClient实例。

【讨论】:

  • 感谢您的回答。最后一点我还不是很清楚。我正在使用我认为支持连接池的 node.js 驱动程序。我的理解是,连接池允许程序在需要时随时请求连接,而驱动程序负责维护池。如果我需要在我的程序中存储连接,在我看来我没有使用连接池概念。你能解释一下吗?提前致谢
  • 乐于助人!不幸的是,我对 node.js 并不熟悉,我听说它是​​单线程的。如果它仍然以某种方式“管道”查询,则可能会发生连接池。在任何情况下,即使在单个线程中甚至在单个连接中,只打开和关闭一次连接都应该会给您带来显着的性能改进。如果 API 设计正确,它应该只是“正常工作”。
  • 也许这应该有助于消除一些混淆:存储在变量中的内容(至少在 Java 中)本身并不是一个连接,而是封装了整个连接和连接池机制的 MongoClient 对象.
猜你喜欢
  • 2012-06-09
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2018-10-30
  • 1970-01-01
相关资源
最近更新 更多