Node.js Mongoose连接池

Node.js Mongoose连接池,node.js,mongoose,Node.js,Mongoose,我注意到Mongoose文档中支持连接池 考虑到节点是单线程的,为什么会有连接池? 池中连接的生命周期是什么?连接池与异步与同步没有任何关系——它的工作原理如下: 您可以指定要维护到数据库的打开连接的数量(比如10个) 每次您的Node JS代码进行查询时,如果可能的话,它将使用已经打开的10个连接中的一个来发出此请求——这样可以避免为每个查询打开新数据库连接的开销 维护连接池实质上就是维护一组db连接对象,并为每个查询挑选未使用的对象。它实际上根本不会影响线程或进程=)显然,节点是单线程

我注意到Mongoose文档中支持连接池

考虑到节点是单线程的,为什么会有连接池?
池中连接的生命周期是什么?

连接池与异步与同步没有任何关系——它的工作原理如下:

  • 您可以指定要维护到数据库的打开连接的数量(比如10个)
  • 每次您的Node JS代码进行查询时,如果可能的话,它将使用已经打开的10个连接中的一个来发出此请求——这样可以避免为每个查询打开新数据库连接的开销

维护连接池实质上就是维护一组db连接对象,并为每个查询挑选未使用的对象。它实际上根本不会影响线程或进程=)

显然,节点是单线程的,但在内部,当节点在引擎盖下调用IO操作时,它有一些线程机制来执行IO。主线程本身不执行这个IO操作,若它正在执行IO,那个么系统已经死了


异步不是一个重要的区别吗?如果它是同步的和单线程的。然后,即使您的池中有N个连接,您也只能使用1个。所以我假设mongoose利用了节点的异步特性。i、 e.一个命令/查询可能会被阻塞,而另一个命令/查询通过不同的连接流式传输数据?同步与异步在这里并不重要,每次打开和关闭连接仍然会有很大的成本延迟(即使是异步的)——您会注意到,随着时间的推移,您的查询将变得越来越慢,因为你在打开/关闭连接上花费了内存。这可以通过一个可重用的持久连接来解决。。不一定是连接池。使用一个持久连接,一次只能处理一个查询。如果使用异步调用,这将不起作用,因为在单个持久连接繁忙时,仍然需要为彼此的连接打开新的连接:(因此,我之所以说异步,是因为在我对池为什么有用感到困惑时,我说我缺少了它。)节点不是单线程的。javascript在同一线程中运行,但许多操作,特别是IO操作,都是在后台线程中完成的。因此,如果对数据库进行多次调用,这些调用将在后台线程中同时完成。结果被封送回主线程,并由javascript一次处理一个,但代码的非javascript部分基本上是并行处理的。