重用mongodb连接并关闭它

时间:2014-06-08 05:28:54

标签: node.js mongodb

我在我的应用程序中使用Node native client 1.4,我发现document中的某些内容有点令人困惑:

  

连接池是由驱动程序维护的数据库连接的缓存,以便在需要与数据库建立新连接时可以重新使用连接。为了减少应用程序创建的连接池数量,我们建议调用MongoClient.connect 并重用回调返回的数据库变量:

阅读本文时会想到几个问题:

  1. 这是否意味着db对象还维护副本集提供的故障转移功能?我认为应该是MongoClient的工作(不确定这个,但C#驱动文档确实说MongoClient维护副本集的东西)
  2. 如果我重用db对象,何时应该调用db.close()函数?我在每个例子中都看到了db.close()。但是,如果我们想重复使用它,我们是不是应该保持开放?
  3. 修改: 由于它是关于重用的主题,我还想知道如何在不同的功能/对象中共享数据库?
    随着项目变得越来越大,我不想将所有函数/对象嵌套在一个大的闭包中,但我也不想将它传递给所有函数/对象。
    在应用程序中分享它的更优雅方式是什么?

1 个答案:

答案 0 :(得分:0)

数据库连接的“连接池”概念已存在一段时间了。它确实是一种常识性方法,因为当您考虑它时,每次希望发出查询时建立与数据库的连接都是非常昂贵的,并且您不希望在涉及额外开销的情况下这样做。

因此,一般原则是你有一个对象句柄(在这种情况下是db引用),它本质上去检查它可以使用哪个“池化”连接,并且可能是当前的“池”是然后充分利用并创建另一个(或其他几个)连接,直到池限制,以便为请求提供服务。

MongoClient类本身只是一个构造函数或“工厂”类型类,其目的是建立连接,实际上是连接池,并返回数据库的句柄以供以后使用。因此,实际上这里创建的连接是为副本集故障转移或可能从可用实例中选择另一个路由器实例以及通常处理连接而管理的。

因此,“长期存在”应用程序中的一般做法是“句柄”全局可用或能够从实例管理器检索以提供对可用连接的访问​​。这避免了在代码中的其他位置“建立”新连接的需要,这已经被称为代价高昂的操作。

您提到的“示例”代码经常通过许多此类驱动程序实现手册或始终调用db.close来提供。但这些只是示例而不是长期运行的应用程序,因此这些示例往往是“循环完成”,因为它们显示了所有“初始化”,各种方法的“用法”,最后是“清理”当应用程序退出时。

良好的应用程序或ODM类型实现通常会有一种方法来设置连接,共享池,然后在应用程序最终退出时正常清理。您可以像编写小脚本的“手册页”示例一样编写代码,但对于较大的长期运行的应用程序,您可能会实现代码以在实际应用程序退出时“清理”您的连接。