【问题标题】:connect() vs createConnection()连接()与创建连接()
【发布时间】:2017-04-10 14:58:09
【问题描述】:

我是使用mongoose 的新手,想知道mongoose.connect()mongoose.createConnection() 之间的根本区别是什么,尤其是在使用它们时要考虑的事项。

我对官方文档的理解是,一般只有一个连接时使用mongoose.connect(),而如果有多个连接实例,则使用mongoose.createConnection()

希望有人能对此进行更多澄清。

另外,如果我的理解是正确的,在单连接中使用mongoose.createConnection() 有什么缺点?为什么不建议我们在每种情况下都使用mongoose.createConnection() 来标准化连接?

【问题讨论】:

标签: mongoose


【解决方案1】:

我对官方文档的理解是,一般只有一个连接时使用mongoose.connect(),而如果有多个连接实例,则使用mongoose.createConnection()。

是的。确切地说,.connect() 实际上创建了一个套接字/连接池(在连接设置中的poolSize 中定义,默认值为 5)它保持打开状态,因此实际上有多个连接,但在一个池中。 话虽这么说,如果您想要多个具有不同属性的连接池,您应该使用createConnection

另外,如果我的理解是正确的,有什么缺点 在单个连接中使用 mongoose.createConnection()?为什么不是 建议我们在每种情况下都使用 mongoose.createConnection() 标准化连接?

这是一个很好的问题,docs也已经有了答案:

当你调用 mongoose.connect() 时,Mongoose 会创建一个默认连接。您可以使用 mongoose.connection 访问默认连接。

基本上.connectcreateConnection 的一组(大部分)最佳实践设置的简写

在大多数简单的项目中,您无需担心指定不同的读取或写入设置、池大小、与不同副本服务器的单独连接等,这就是 .connect 存在的原因。

但是,如果您有更苛刻的要求(例如出于法律或性能原因),您可能必须使用createConnection

几周前,我遇到了一种情况,我的一个(内部)统计数据包需要偶尔访问数据库,但负载很大。由于我不想将 db/mongoose 对象传递给包以使其尽可能模块化,因此我只是创建了一个新连接。这非常有效,因为我只需要访问我在包中定义的某个模型,而不是在我的“父”包中定义的模型。由于新包只需要读取权限,并且可以从不同的从/副本数据库读取以减少主数据库的负载,因此我在两端切换到 createConnection 以将连接与主数据库分开。

对我来说,在同一个模块中创建多个连接的最大缺点是,如果它们被定义在不同的连接中,你就不能通过mongoose.model 直接访问你的模型。这个答案详细说明了这个问题:https://stackoverflow.com/a/22838614/2856218

【讨论】:

  • 最近也遇到了同样的问题。但要处理需要连接到多个域,即不同域后面的 2 个集群。 Mongoose 和 MongoDB 似乎是围绕每个进程的单个集群连接设计的。这导致我测试了不同的方法来管理它,即集群节点进程,或者运行一个微服务架构,只是为了将这两个集群连接到我的 API 的一个分支。你以前有没有遇到过这个问题?
  • 我以前没有遇到过这个确切的问题,我不确定我是否理解正确,但是是什么阻止你使用 createConnection 像这样:stackoverflow.com/a/19475270/2856218,只使用 cluster-urls? mongoosejs.com/docs/connections.html#mongos_connections
  • @BenSower 但这意味着您必须在创建模型时传递 conn 和 conn2 对象,对吗?所以每次创建新对象时,都要做 = new MyModelA(conn) 或 new MyModelA(conn2)
  • @FrancisZabala:是的,也不是。是的,你必须告诉猫鼬这个模型应该在哪个连接上“注册”。不,您不会将其传递给模型,而是像这样在连接上创建模型: var ModelB = yourConnection.model('Model', new mongoose.Schema({ title :String }));正如我在原始评论中提到的,使用 mongoose.model() 只是在 mongoose 创建的默认连接上注册它的简写。你也可以做 mongoose.connection.model()。
  • “对象”是什么意思?模型还是文档?每次创建/注册模型时,都必须这样做,是的。创建文档时,您可以直接调用模型,如 new Model({title: 'someTitle'})。由于模型只存在于特定连接的范围内,所以它也只会保存在那里。
猜你喜欢
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 2019-03-28
  • 2011-12-16
  • 1970-01-01
相关资源
最近更新 更多