Overview
在本指南中,您可以学习;了解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 String 或 ClientOptions标签页,查看相应的语法:
以下是可用于配置连接池的连接字符串设置:
设置 | 说明 |
---|---|
| 池中打开的最大连接数。如果操作需要新连接,而连接池有 默认: |
| 池中打开的最小连接数。连接池使用此数量的套接字进行初始化。 默认值: |
| 池可以同时建立的最大连接数。 默认: |
| 连接在池中可保持空闲状态的最大毫秒数,在此时间过后,连接将被删除或关闭。 默认: |
| 指定线程可以等待连接变为可用的最大等待时间(以毫秒为单位)。等待套接字的时间超过此定义的时间长度的操作会引发连接错误。 Default: |
下表描述了可以链接到设置以修改驱动程序行为的方法:
设置 | 说明 |
---|---|
| 池中打开的最大连接数。如果操作需要新连接,而连接池已配置最大打开连接数,则新操作将等待打开新连接。要限制此等待时间,请使用单个超时设置。 默认: |
| 池中打开的最小连接数。 默认值: |
| 池可以同时建立的最大连接数。 默认: |
| 连接在池中可保持空闲状态的最大毫秒数,在此时间过后,连接将被删除或关闭。 默认: |
例子
选择 Connection String 或 ClientOptions标签页,查看相应示例:
优化连接池
连接池的速率受到限制,因此每个连接池在任何时候最多只能并行创建 maxConnecting
个连接。任何新的goroutine在以下情况下都会停止等待:
其中一个现有的 goroutines 完成创建连接,或者一个现有的连接被退回到池中。
由于对创建连接的速率有限制,驱动程序重用现有连接的能力得到了提高。
该驾驶员不限制等待套接字变为可用状态的操作数量,因此应用程序负责管理其操作队列。除非您定义 waitQueueTimeoutMS
选项,否则操作可以等待任意时间长度。
如果操作等待套接字的时间超过 waitQueueTimeoutMS
所定义的时长,则会引发连接错误。如果在负载峰值期间限制操作的持续时间比完成每个操作更重要,请使用此选项。
断开连接
当您从任何goroutine调用 Client.Disconnect()
时,驾驶员会关闭所有空闲套接字,然后在所有套接字返回到池中时关闭它们。
更多信息
有关使用连接池的更多信息,请参阅服务器手册中的连接池文档。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: