2016-08-22 142 views
5

我通过它的驱动程序使用MongoDB的使用Node.js语言MongoDB的 - 打开和关闭连接 - 建议对好的做法

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

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

任何意见是非常感谢。

+0

你在使用什么框架(node,python,c#)? – profesor79

+0

我正在使用node.js. Thx – Picci

+0

我使用node.js,我想知道是否(以及如何)连接池可以与node.js驱动程序一起工作。 Thx – Picci

回答

6

最好的做法是打开一次连接,将其存储在一个变量中并在末尾关闭它。 MongoDB明确推荐这一点。这就是为什么打开和关闭连接是MongoDB API的一部分,而不是为每个查询自动发生的原因。对于每个查询

打开和关闭连接都将在性能(CPU +延迟),网络流量,内存管理(创建和删除对象)方面引入了显著的开销,不仅为客户同时也为服务器本身,这也影响到其他客户。

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

创建MongoClient情况只有一次,对于支持的驱动程序,还可以让你从连接池其中驾驶员保持着活跃的连接并行你,让你也只需要创建一个MongoClient受益跨多个线程的实例。

+0

谢谢你的答案。最后一点对我来说还不完全清楚。我正在使用我认为支持连接池的node.js驱动程序。我的理解是连接池允许程序随时需要连接,而驱动程序负责维护池。如果我需要将连接存储在我的程序中,那么对我来说,我并没有使用连接池概念。你能否解释我?在此先感谢 – Picci

+0

乐意帮忙!不幸的是,我不熟悉node.js,我听说它是​​单线程的。如果它仍以某种方式“查询”查询,可能会发生连接池。无论如何,只需打开和关闭连接一次,即使在单线程中,甚至只需一次连接,也可以显着提高性能。如果API的设计正确,它应该简单地“只是工作”。 –

+0

也许这应该有助于消除一些混淆:变量中存储的内容(至少在Java中)本身并不是一个连接,它是封装了整个连接和连接池机制的MongoClient对象。 –