一尘不染

SetMaxOpenConns和SetMaxIdleConns

go

为什么有SetMaxOpenConnsSetMaxIdleConns。在文档中

SetMaxIdleConns

SetMaxIdleConns设置空闲连接池中的最大连接数。

如果MaxOpenConns大于0但小于新的MaxIdleConns,则新的MaxIdleConns将减少以匹配MaxOpenConns限制

如果n <= 0,则不保留空闲连接。

SetMaxOpenConns

SetMaxOpenConns设置与数据库的最大打开连接数。

如果MaxIdleConns大于0并且新的MaxOpenConns小于MaxIdleConns,则MaxIdleConns将减少以匹配新的MaxOpenConns限制

如果n <= 0,则打开的连接数没有限制。默认值为0(无限制)。

为什么要同时具有这两个功能而不是一个功能来调整空闲连接和打开连接,例如MaxConnsis MaxIdleConns + MaxOpenConns。为什么开发人员不得不安排可能有多少个打开和空闲的连接而不是定义总池?


阅读 2050

收藏
2020-07-02

共1个答案

一尘不染

数据库池可能包含0个或多个与数据库的空闲连接。这些是已建立,使用而不是关闭的连接,保留在将来使用。我们可以保留的数量是MaxIdleConns

当您请求这些空闲连接之一时,它将变为打开连接,供您使用。您可以使用的数量是MaxOpenConns

现在,没有什么空闲连接比允许的最大打开连接要多了,因为如果您 可以
立即获取所有允许的打开连接,则其余的空闲连接将始终保持空闲状态。就像有一条四车道的桥,但只允许三辆车一次驶过它一样。

因此,我们希望确保

MaxIdleConns <= MaxOpenConns

该功能被写入通过降低以保持不变MaxIdleConns,只要超过MaxOpenConns。请注意,文档中说,只有MaxIdleConns将其简化为match
MaxOpenConns,后者才是不正确的。

要回答为什么开发人员可能要分别调整这些问题,请考虑以下情况:通常安静的应用程序,但偶尔需要打开大量连接。您可能希望指定一个大MaxOpenConns但很小的值MaxIdleConns,以确保您的应用程序可以在需要时随时打开所需的连接,但是可以快速释放这些资源,从而为自身
数据库释放内存。使空闲连接保持活动不是免费的,并且通常可以这样做,因为您想尽快将其变为可用的连接。

因此,这里有两个数字的原因是这是两个参数,您可能有充分的理由分别进行更改。当然,API的语义意味着如果您不关心设置这两个值,则可以只设置您关心的一个值,这很可能是MaxOpenConns

2020-07-02