为什么有SetMaxOpenConns和SetMaxIdleConns。在文档中设置最大空闲连接数SetMaxIdleConns 设置空闲连接池中的最大连接数。如果 MaxOpenConns 大于 0 但小于新的 MaxIdleConns,则新的 MaxIdleConns 将减少以匹配 MaxOpenConns 限制如果 n <= 0,则不保留空闲连接。SetMaxOpenConnsSetMaxOpenConns 设置到数据库的最大打开连接数。如果 MaxIdleConns 大于 0 并且新的 MaxOpenConns 小于 MaxIdleConns,则 MaxIdleConns 将减少以匹配新的 MaxOpenConns 限制如果 n <= 0,则对打开的连接数没有限制。默认值为 0(无限制)。为什么有两种功能,但不是一个单一的功能调整空闲的,开放连接好像MaxConns是MaxIdleConns + MaxOpenConns。为什么开发人员必须安排可以有多少个打开和空闲的连接,而不是定义总池?
1 回答
ibeautiful
TA贡献1993条经验 获得超5个赞
数据库池可能包含 0 个或多个与数据库的空闲连接。这些是建立、使用而不是关闭的连接,保留以备将来使用。我们可以保留的这些数量是MaxIdleConns
.
当您请求这些空闲连接之一时,它会变成开放连接,可供您使用。您可以使用的数量是MaxOpenConns
.
现在,拥有比允许的最大打开连接数更多的空闲连接毫无意义,因为如果您可以立即获取所有允许的打开连接,剩余的空闲连接将始终保持空闲状态。这就像一座有四车道的桥,但一次只能允许三辆车通过。
因此,我们希望确保
MaxIdleConns <= MaxOpenConns
编写函数是为了通过MaxIdleConns
在超过 时减少来保持这个不变量MaxOpenConns
。请注意,文档说, only MaxIdleConns
is ever reduction to match MaxOpenConns
,后者永远不会正确。
要回答为什么开发人员可能要单独调整这些问题:考虑一个通常安静但偶尔需要打开大量连接的应用程序的情况。您可能希望指定一个大MaxOpenConns
但非常小的MaxIdleConns
,以确保您的应用程序可以在需要时打开尽可能多的连接,但快速释放这些资源,为自身和数据库释放内存。保持空闲连接处于活动状态并不是免费的,通常这样做是因为您想尽快将其转换为可用连接。
所以这里有两个数字的原因是这两个参数你可能有充分的理由单独改变。当然,API 的语义意味着,如果您不关心设置这两个值,则可以只设置您关心的一个,这可能是MaxOpenConns
- 1 回答
- 0 关注
- 396 浏览
添加回答
举报
0/150
提交
取消