Docs 菜单
Docs 主页
/ / /
Node.js 驱动程序
/ /

使用连接池管理连接

在本指南中,您可以学习;了解Node.js驾驶员如何使用连接池来管理与MongoDB 部署的连接,以及如何在应用程序中配置连接池设置。

连接池是由 Node.js驾驶员维护的打开数据库连接的缓存。当应用程序请求连接到MongoDB时,Node.js驾驶员会无缝地从池中获取连接,执行操作,然后将连接返回到池中以供重用。

连接池有助于减少应用程序延迟和 Node.js驾驶员创建新连接的次数。

对于MongoDB拓扑结构中的每个服务器,每个 MongoClient实例都有一个内置连接池。如果不配置 minPoolSize 选项,连接池将按需打开套接字以支持应用程序中对MongoDB 的并发请求。

您可以在 MongoClient实例中指定以下连接池设置:

设置
说明

maxPoolSize

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

maxConnecting

The maximum number of connections that each pool can establish concurrently.

minPoolSize

The minimum number of concurrent connections that the pool maintains.

Default: 0

maxIdleTimeMS

The maximum number of milliseconds that a connection can remain idle in the pool.

Default: 0 (no limit)

waitQueueTimeoutMS

The maximum number of milliseconds that a request can wait for a socket to become available.

Default: 0 (no limit)

除了支持应用程序请求所需的套接字之外,每个 MongoClient实例还为MongoDB拓扑结构中的每个服务器最多打开两个连接,用于监控服务器的状态。

示例,连接到三节点副本集的客户端会打开六个监控套接字。如果应用程序使用 maxPoolSize 的默认设置,并且仅查询主节点 (primary node in the replica set)(默认)节点,则连接池最多可以有 106 个打开的套接字和 100 个连接。如果应用程序使用 个读取偏好(read preference)来查询从节点(secondary node from replica set)节点,则这些连接池会增长,并且总连接数可能为306 个,包括打开的监控套接字。

要在一个进程中支持大量并发 MongoDB 请求,可以增加 maxPoolSize

以下代码通过在 options对象中指定 maxPoolSize 选项来创建最大连接池大小为 200MongoClient实例:

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
maxPoolSize: 200
});

连接池对连接建立进行速率限制。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 选项设立的连接数。如果套接字关闭,导致套接字总数(包括使用中的和空闲的)下降到最小值以下,则会打开更多套接字,直到达到最小值。

以下代码通过在 options对象中指定 minPoolSize 选项,创建一个最小连接池大小为 10MongoClient实例:

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
minPoolSize: 10
});

您可以通过设置 maxIdleTimeMS 选项来设置一个连接在连接池中保持空闲状态的最大毫秒数。一旦 maxIdleTimeMS 的连接处于空闲状态,连接池就会将其删除并替换。此选项默认为 0(无限制)。

以下代码通过在 options对象中指定 maxIdleTimeMS 设置来创建最大空闲时间为 10000 毫秒(10 秒)的 MongoClient实例:

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
maxIdleTimeMS: 10000
});

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 部分。

有关使用 Node.js驾驶员创建 MongoClient对象和指定选项的更多信息,请参阅以下API文档:

后退

限制MongoDB Server执行时间

在此页面上