gpt4 book ai didi

node.js - 重用 mongodb 连接并关闭它

转载 作者:太空宇宙 更新时间:2023-11-03 22:37:29 24 4
gpt4 key购买 nike

我在我的应用程序中使用 Node native 客户端 1.4,并且我在 document 中找到了一些内容有点令人困惑:

A Connection Pool is a cache of database connections maintained by the driver so that connections can be re-used when new connections to the database are required. To reduce the number of connection pools created by your application, we recommend calling MongoClient.connect once and reusing the database variable returned by the callback:

阅读本文时,我想到了几个问题:

  1. 这是否意味着数据库对象还保留了副本集提供的故障转移功能?我认为这应该是 MongoClient 的工作(对此不确定,但 C# 驱动程序文档确实说 MongoClient 维护副本集内容)
  2. 如果我要重用 db 对象,何时应该调用 db.close() 函数?我在每个示例中都看到了 db.close() 。但如果我们想重用它,难道不应该保持它打开吗?

编辑:由于这是一个关于重用的主题,我还想知道我们如何在不同的函数/对象中共享数据库?
随着项目变得越来越大,我不想将所有函数/对象嵌套在一个大闭包中,但我也不想将其传递给所有函数/对象。
在应用程序之间共享它的更优雅的方式是什么?

最佳答案

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

因此,一般原则是,您有一个对象句柄(在本例中为 db 引用),该句柄本质上是检查它可以使用哪个“池”连接,以及可能是否当前“然后,“池”将被充分利用,并创建另一个(或其他一些)连接,直至达到池限制,以便为请求提供服务。

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

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

您提到了许多此类驱动程序实现手册中经常出现的“示例”代码,这些代码经常或总是调用db.close。但这些只是示例,并不打算作为长时间运行的应用程序,因此这些示例往往是“循环完整”的,因为它们显示了所有“初始化”、各种方法的“使用”以及最后的“清理”当应用程序退出时。

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

关于node.js - 重用 mongodb 连接并关闭它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24103291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com