Overview
在本指南中,您可以学习;了解Node.js驾驶员如何使用连接池来管理与MongoDB 部署的连接,以及如何在应用程序中配置连接池设置。
连接池是由 Node.js驾驶员维护的打开数据库连接的缓存。当应用程序请求连接到MongoDB时,Node.js驾驶员会无缝地从池中获取连接,执行操作,然后将连接返回到池中以供重用。
连接池有助于减少应用程序延迟和 Node.js驾驶员创建新连接的次数。
配置连接池
对于MongoDB拓扑结构中的每个服务器,每个 MongoClient
实例都有一个内置连接池。如果不配置 minPoolSize
选项,连接池将按需打开套接字以支持应用程序中对MongoDB 的并发请求。
您可以在 MongoClient
实例中指定以下连接池设置:
设置 | 说明 |
---|---|
| The maximum number of concurrent connections that the pool maintains.
If the number of in-use connections to a server reaches the specified
value, the next request to that server waits until a connection becomes
available. Default: 100 |
| The maximum number of connections that each pool can establish
concurrently. |
| The minimum number of concurrent connections that the pool maintains. Default: 0 |
| The maximum number of milliseconds that a connection can remain idle in
the pool. Default: 0 (no limit) |
| The maximum number of milliseconds that a request can wait for a socket
to become available. Default: 0 (no limit) |
maxPoolSize
除了支持应用程序请求所需的套接字之外,每个 MongoClient
实例还为MongoDB拓扑结构中的每个服务器最多打开两个连接,用于监控服务器的状态。
示例,连接到三节点副本集的客户端会打开六个监控套接字。如果应用程序使用 maxPoolSize
的默认设置,并且仅查询主节点 (primary node in the replica set)(默认)节点,则连接池最多可以有 106
个打开的套接字和 100
个连接。如果应用程序使用 个读取偏好(read preference)来查询从节点(secondary node from replica set)节点,则这些连接池会增长,并且总连接数可能为306
个,包括打开的监控套接字。
要在一个进程中支持大量并发 MongoDB 请求,可以增加 maxPoolSize
。
以下代码通过在 options
对象中指定 maxPoolSize
选项来创建最大连接池大小为 200
的 MongoClient
实例:
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { maxPoolSize: 200 });
maxConnecting
连接池对连接建立进行速率限制。maxConnecting
选项决定连接池在任何时候可以并行创建的连接数量。示例,如果 maxConnecting
的值为 2
,则仅当发生以下情况之一时,尝试同时签出连接的第三个请求才会成功:
连接池完成创建连接,且池中连接数少于
maxPoolSize
。现有连接会重新检入池中。
以下代码通过在 options
对象中指定 maxConnecting
选项,创建一个 MongoClient
实例,其中每个池要同时建立最大数量 2
连接:
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { maxConnecting: 2 });
minPoolSize
您可以使用 minPoolSize
选项设立每个服务器的最小连接数。驾驶员确保连接池的连接数始终至少达到 minPoolSize
选项设立的连接数。如果套接字关闭,导致套接字总数(包括使用中的和空闲的)下降到最小值以下,则会打开更多套接字,直到达到最小值。
以下代码通过在 options
对象中指定 minPoolSize
选项,创建一个最小连接池大小为 10
的 MongoClient
实例:
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { minPoolSize: 10 });
maxIdleTimeMS
您可以通过设置 maxIdleTimeMS
选项来设置一个连接在连接池中保持空闲状态的最大毫秒数。一旦 maxIdleTimeMS
的连接处于空闲状态,连接池就会将其删除并替换。此选项默认为 0
(无限制)。
以下代码通过在 options
对象中指定 maxIdleTimeMS
设置来创建最大空闲时间为 10000
毫秒(10 秒)的 MongoClient
实例:
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { maxIdleTimeMS: 10000 });
waitQueueTimeoutMS
MongoClient
支持多个并发请求。为每个流程创建一个客户端,并重复用于流程中的所有操作。这种做法比为每个请求创建一个客户端更有效率。
该驱动程序不限制可以等待套接字变为可用状态的请求数量,应用程序有责任在负载峰值期间将其池的大小限制为绑定队列。请求等待的时间为 waitQueueTimeoutMS
选项中指定的时间,默认为 0
(无限制)。
如果请求等待套接字的时间超过 waitQueueTimeoutMS
所定义的时长,则会引发连接错误。如果在负载峰值期间限制操作的持续时间比完成每个操作更重要,请使用此选项。
以下代码通过在 options
对象中声明来创建一个 MongoClient
实例,其最大等待队列超时为 10000
毫秒(10 秒):
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { waitQueueTimeoutMS: 10000 });
关闭连接
当任何请求调用 MongoClient.close()
时,Node.js驾驶员会执行以下操作:
关闭连接池的所有空闲套接字
关闭所有正在使用的套接字,因为它们会返回到池中
仅当关联操作完成时才关闭所有正在使用的套接字
调用 MongoClient.close()
仅关闭不活动的套接字,而不会直接终止任何正在进行的操作。
注意
MongoClient.close()
方法会关闭现有会话和事务,这可能会间接影响正在进行的操作和打开的游标的行为。
避免套接字超时
拥有大型连接池并不总能减少重新连接请求。请考虑以下示例场景:
应用程序的连接池大小为 5 个套接字,并将
socketTimeoutMS
选项设立为 5000 毫秒。操作平均每 3000 毫秒发生一次,并且重新连接请求很频繁。
每个套接字在 5000 毫秒后超时,这意味着所有套接字都必须在这 5000 毫秒内执行某些操作以避免关闭。
在这种情况下,每个套接字会在 5000 毫秒后超时,因此需要在此超时期限内进行活动以避免关闭。但是,每 3000 毫秒一条消息不足以让所有套接字保持活动状态,从而导致其中几个套接字超时。
要避免套接字超时过多,请通过指定 maxPoolSize
选项来减少驾驶员在连接池可以维护的连接数。要学习;了解如何设立maxPoolSize
选项,请参阅 maxPoolSize 部分。
API 文档
有关使用 Node.js驾驶员创建 MongoClient
对象和指定选项的更多信息,请参阅以下API文档: