Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs 菜单
Docs 主页
/ /

使用连接池管理连接

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

连接池是由驾驶员维护的打开数据库连接的缓存。当应用程序需要执行操作时,驾驶员会从池中取出连接,使用它来运行操作,然后将连接返回到池中以供重复使用。重用连接有助于减少应用程序延迟,并避免为每个操作创建新连接的开销。

要连接到MongoDB,您需要创建一个 Client实例。每个 Client 都维护一个内部连接池,并自动处理连接管理的大多数方面,包括发现服务器拓扑结构和监控部署。

以下代码展示了如何创建使用默认连接设置的客户端:

let client_default = Client::with_uri_str(uri).await?;

如果您的工作负载有特定的性能或并发要求,则可以在构造 Client 之前通过设置 ClientOptions 上的选项来调整连接池。

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

您可以通过在 ClientOptions实例中设置以下选项来配置连接池行为:

选项
说明

max_pool_size

Maximum number of concurrent connections that each pool maintains.
Default: 10

max_connecting

Maximum number of connections that each pool can establish concurrently.
Default: 2

min_pool_size

Minimum number of concurrent connections that each pool maintains.
Default: 0

max_idle_time

Maximum amount of time that a connection can remain idle in the pool before the driver removes and replaces it.
Default: 0 (no limit)

以下示例展示了如何在创建客户端时配置连接池选项:

let mut client_options = ClientOptions::parse(uri).await?;
client_options.max_pool_size = Some(20);
client_options.max_connecting = Some(3);
client_options.min_pool_size = Some(1);
client_options.max_idle_time = Some(Duration::new(90, 0));
let client_custom = Client::with_options(client_options)?;

max_pool_size 选项控制每个池为给定服务器维护的最大连接数。默认为 10。当服务器的正在使用的连接数达到此限制时,需要该池连接的后续请求必须等待,直到现有连接重新签入。

除了用于提供服务应用程序请求的套接字之外,每个 Client 还为拓扑结构中的每个服务器打开两个额外的套接字,以监控服务器状态。示例,三节点副本集执行以下操作:

  • 驾驶员打开六个监控套接字,或每个节点两个。

  • 如果您的应用程序使用默认的max_pool_size ,并且仅读取和写入主节点 (primary node in the replica set),连接池最多可容纳16 个连接。此总数包括10 个应用程序连接和6 个监控连接。

  • 如果您的应用程序使用的读取偏好(read preference)也针对从节点,则驾驶员也会为这些节点维护池,并且所有池和监控套接字的总连接数可以为36

对于需要单个进程的高并发性的工作负载,请增加 max_pool_size 以允许更多并发连接。以下示例将 max_pool_size 连接增加到 20

let mut client_options = ClientOptions::parse(uri).await?;
client_options.max_pool_size = Some(20);
let client_max_pool = Client::with_options(client_options)?;

连接池限制并行创建的新连接数量。 max_connecting 选项控制每个池可以同时建立的最大连接数。默认值为 2

示例,当 max_connecting设立为 2 时,仅当发生以下任一情况后,需要新连接的第三个并发请求才会成功:

  • 池完成连接创建,并且连接总数小于或等于 max_pool_size

  • 正在使用的连接将返回到池中。

以这种方式对连接创建进行速率限制会鼓励驾驶员重复使用现有连接,而不是打开新连接。

要增加可并行创建的连接数,请为 max_connecting设立更高的值,如以下示例所示:

let mut client_options = ClientOptions::parse(uri).await?;
client_options.max_connecting = Some(3);
let client_concurrent = Client::with_options(client_options)?;

min_pool_size 选项设置每个池为服务器维护的最小连接数。默认为 0。当您设立正数的 min_pool_size 时,驾驶员会使用那么多连接初始化池,并尝试始终保持至少那么多连接打开。

如果连接关闭,并且使用中和空闲连接的总数降至 min_pool_size 以下,则池会打开新连接,直到达到配置的最小值。这对于在流量高峰时需要就绪连接池的工作负载非常有用。

要配置最小池大小,请在创建 Client 时将 min_pool_size设立为所需的连接数,如以下示例所示:

let mut client_options = ClientOptions::parse(uri).await?;
client_options.min_pool_size = Some(1);
let client_min_pool = Client::with_options(client_options)?;

max_idle_time 选项控制在驾驶员删除并替换连接之前,连接在池中保持空闲状态的时间。默认值为 0,这意味着没有空闲时间限制。

当连接的空闲时间达到 max_idle_time 指定的持续时间时,池会丢弃该连接并根据需要打开一个替换连接。这有助于防止应用程序占用可能被防火墙或网络基础架构关闭的长时间空闲连接。

以下示例显示如何将最大空闲时间配置为 90 秒:

let mut client_options = ClientOptions::parse(uri).await?;
client_options.max_idle_time = Some(Duration::new(90, 0));
let client_idle = Client::with_options(client_options)?;

要主动关闭由 Client托管的连接,请调用 Client::shutdown() 方法。调用此方法时,驾驶员会执行以下操作:

  • 关闭池中的所有空闲套接字

  • 将当前正在使用的套接字返回到池中时将其关闭

调用 Client::shutdown() 不会中断正在进行的操作。驾驶员仅在关联操作完成并将连接检回池中后才会关闭套接字。当进程退出时,驾驶员还会关闭所有剩余的套接字。

要学习;了解有关连接池的更多信息,请参阅MongoDB Server手册中的 调整连接池设置。

要进一步了解本指南所讨论的方法和类型,请参阅以下 API 文档:

后退

Stable API

在此页面上