为什么有SetMaxOpenConnsSetMaxIdleConns。在doc

SetMaxIdleConns



SetMaxOpenConns



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

最佳答案

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

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

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

因此,我们希望确保

MaxIdleConns <= MaxOpenConns

编写函数以通过在超过MaxIdleConns时减少MaxOpenConns来保留此不变式。请注意,文档中说,只有MaxIdleConns才被还原为与MaxOpenConns匹配,后者永远都不是。

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

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

关于database - SetMaxOpenConns和SetMaxIdleConns,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31952791/

10-10 10:29