Overview
在本指南中,您可以学习如何Node.js驱动程序使用连接池来管理与MongoDB部署的连接,以及如何在应用程序中配置连接池设置。
连接池是由 Node.js 驱动程序维护的打开数据库连接的缓存。当应用程序请求连接到MongoDB时,Node.js驱动程序会无缝地从池中获取连接,执行操作,然后将连接返回到池中以供重用。
连接池有助于减少应用程序延迟和 Node.js驱动程序创建新连接的次数。
配置连接池
对于MongoDB拓扑结构中的每个服务器,每个 MongoClient实例都有一个内置连接池。如果不配置 minPoolSize 选项,连接池将按需打开套接字以支持应用程序中对MongoDB 的并发请求。
您可以在 MongoClient实例中指定以下连接池设置:
设置 | 说明 |
|---|---|
| 池维护的最大并发连接数。如果正在使用的服务器连接数达到指定值,则对该服务器的下一个请求将等待,直到出现可用连接。 |
| 每个池可以同时建立的最大连接数。 |
| 池维护的最小并发连接数。 |
| 连接在连接池中可以保持空闲状态的最大毫秒数。将此值设置为高于应用程序的预期空闲时间,但低于防火墙或代理连接超时,以防止意外断开连接。 |
| 请求可以等待套接字变为可用状态的最大毫秒数。 |
maxPoolSize
除了支持应用程序请求所需的套接字之外,每个 MongoClient实例还为MongoDB拓扑结构中的每个服务器最多打开两个连接,用于监控服务器的状态。
For example, a client connected to a three-node replica set opens six monitoring sockets. If the application uses the default setting for maxPoolSize and only queries the primary (default) node, then there can be at most 106 open sockets and 100 connections in the connection pool. If the application uses a read preference to query the secondary nodes, those connection pools grow and there can be 306 total connections including the open monitoring sockets.
要在一个进程中支持大量并发 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 并将 minPoolSize设立为 0 的 MongoClient 对于具有持续低活动期的工作负载是最佳选择。此配置允许连接池在不活动期间关闭未使用的连接。
在 6.18.0 之前的版本中,当在不活动期间将 minPoolSize设立为 0 时,Node.js驱动程序不会关闭空闲连接。从版本 6.18.0 开始,无论 minPoolSize 设置如何,连接池都会正确关闭空闲连接。
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文档: