Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么猫鼬会打开两个连接?_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 为什么猫鼬会打开两个连接?

Node.js 为什么猫鼬会打开两个连接?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,这是一个来自mongoose快速指南的简单文件 mongoose.js 我尝试使用db.one方法,但效果相同 在这种情况下,为什么mongoose会打开第二个连接 Mongoose在底层使用本机mongo驱动程序,然后使用连接池-我相信默认值是5个连接(选中) 因此,当您的mongoose连接有同时请求时,它将使用最多5个同时连接 由于user.save和user.find都是异步的,所以它们将同时执行。因此,您的“程序”告诉节点: 1. Ok, you need to shoot a `sa

这是一个来自mongoose快速指南的简单文件

mongoose.js

我尝试使用
db.one
方法,但效果相同

在这种情况下,为什么mongoose会打开第二个连接


Mongoose在底层使用本机mongo驱动程序,然后使用连接池-我相信默认值是5个连接(选中)

因此,当您的mongoose连接有同时请求时,它将使用最多5个同时连接

由于
user.save
user.find
都是异步的,所以它们将同时执行。因此,您的“程序”告诉节点:

1. Ok, you need to shoot a `save` request for this user.
2. Also, you need to fire this `find` request.
然后,节点运行时读取这些,并在整个函数中运行(直到
返回
)。然后看它的注释:

  • 我应该叫这个
    save
  • 我还需要调用此
    find
  • 嘿,mongo本机驱动程序(用C++编写)-这里有两个任务
  • 然后mongo驱动程序发出第一个请求。它看到它被允许打开比一个更多的连接,所以它这样做了,并激发第二个请求,而不等待第一个请求完成
如果您在
保存
的回调中调用
查找
,它将是顺序的,并且驱动程序可能会重用它已经拥有的连接

例如:

// open the first connection
user.save(function(err) {

  if (err) {

    console.log('I always do this super boring error check:', err);
    return;
  }
  // Now that the first request is done, we fire the second one, and
  // we probably end up reusing the connection.
  User.find(/*...*/);
});
或类似的承诺:

user.save().exec().then(function(){
  return User.find(query);
})
.then(function(users) {
  console.log(users);
})
.catch(function(err) {
  // if either fails, the error ends up here.
  console.log(err);
});
顺便说一下,出于某种原因,如果需要,您可以告诉mongoose只使用一个连接:

let connection = mongoose.createConnection(dbUrl, {server: {poolSize: 1}});
这将是它的要点


阅读更多关于和的信息。

感谢您的精彩解释!我想补充一点,对于一个拥有数百甚至数千个连接池的客户端来说,这并不罕见。@MarkusWMahlberg可能是这样,但我认为拥有数百个连接的客户端不会如此频繁。我想,这取决于使用情况。好吧,它与其他地方非常相似:每个并发用户都有一个DB连接。尽管使用了节点的并发模型。。。好吧,允许许多联系当然没有坏处。如果只使用了一小部分,也不会造成伤害。
let connection = mongoose.createConnection(dbUrl, {server: {poolSize: 1}});