Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/ / /
Go 驱动程序
/ /

连接池

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

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

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

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

当新的 Client实例启动时,它会为MongoDB拓扑结构中的每个服务器打开两个套接字,用于监控服务器的状态。

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

为了效率,请为每个进程创建一个客户端,然后在所有操作中重复使用。避免为每个请求创建新客户端,因为这会增加延迟。

如果由于任何网络错误导致套接字关闭,导致套接字总数(包括使用中的和闲置的)下降到最小值以下,则会打开更多套接字,直至达到最小值。

您可以使用连接字符串或使用 options.Client 方法指定连接池的设置。

选择 Connection StringClientOptions标签页,查看相应的语法:

以下是可用于配置连接池的连接字符串设置:

设置
说明

maxPoolSize

池中打开的最大连接数。如果操作需要新连接,而连接池有 maxPoolSize 个打开的连接,则新操作将等待新连接打开。要限制此等待时间,请使用单个超时设置。

默认: 100

minPoolSize

池中打开的最小连接数。连接池使用此数量的套接字进行初始化。minPoolSize 的值必须小于 maxPoolSize 的值。

默认值0

maxConnecting

池可以同时建立的最大连接数。

默认: 2

maxIdleTimeMS

连接在池中可保持空闲状态的最大毫秒数,在此时间过后,连接将被删除或关闭。

默认: None (no limit)

waitQueueTimeoutMS`

指定线程可以等待连接变为可用的最大等待时间(以毫秒为单位)。等待套接字的时间超过此定义的时间长度的操作会引发连接错误。

Default: 0 (no limit)

下表描述了可以链接到设置以修改驱动程序行为的方法:

设置
说明

SetMaxPoolSize()

池中打开的最大连接数。如果操作需要新连接,而连接池已配置最大打开连接数,则新操作将等待打开新连接。要限制此等待时间,请使用单个超时设置。

默认: 100

SetMinPoolSize()

池中打开的最小连接数。MinPoolSize 的值必须小于 MaxPoolSize 的值。

默认值0

SetMaxConnecting()

池可以同时建立的最大连接数。

默认: 2

SetMaxConnIdleTime()

连接在池中可保持空闲状态的最大毫秒数,在此时间过后,连接将被删除或关闭。

默认: 0 (no limit)

选择 Connection StringClientOptions标签页,查看相应示例:

以下代码使用连接字符串配置最大连接池大小 50、最小池大小 10 以及最大空闲时间 30000 毫秒(30 秒):

// Connection string with connection pool options
const uri = "mongodb://localhost:27017/?maxPoolSize=50&minPoolSize=10&maxIdleTimeMS=30000"

以下代码创建一个客户端并将连接字符串传递给 ApplyURI() 方法:

// Creates a new client and connects to the server
client, err := mongo.Connect(options.Client().ApplyURI(uri))
if err != nil {
log.Fatal(err)
}

以下代码创建一个客户端,并设置连接池选项,最大连接池大小为 50,最小连接池大小为 10,最大空闲时间为 30000 毫秒(30 秒):

// Sets client options with connection pool settings
clientOptions := options.Client().
ApplyURI(uri).
SetMaxPoolSize(50).
SetMinPoolSize(10).
SetMaxConnIdleTime(30 * time.Second)
// Creates a new client and connects to the server
client, err := mongo.Connect(clientOptions)
if err != nil {
log.Fatal(err)
}

连接池的速率受到限制,因此每个连接池在任何时候最多只能并行创建 maxConnecting 个连接。任何新的goroutine在以下情况下都会停止等待:

  • 其中一个现有的 goroutines 完成创建连接,或者一个现有的连接被退回到池中。

  • 由于对创建连接的速率有限制,驱动程序重用现有连接的能力得到了提高。

该驾驶员不限制等待套接字变为可用状态的操作数量,因此应用程序负责管理其操作队列。除非您定义 waitQueueTimeoutMS 选项,否则操作可以等待任意时间长度。

如果操作等待套接字的时间超过 waitQueueTimeoutMS 所定义的时长,则会引发连接错误。如果在负载峰值期间限制操作的持续时间比完成每个操作更重要,请使用此选项。

当您从任何goroutine调用 Client.Disconnect() 时,驾驶员会关闭所有空闲套接字,然后在所有套接字返回到池中时关闭它们。

有关使用连接池的更多信息,请参阅服务器手册中的连接池文档。

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

后退

限制MongoDB Server执行时间

在此页面上