为什么有SetMaxOpenConns和SetMaxIdleConns.在文档中
SetMaxIdleConns
SetMaxIdleConns设置空闲连接池中的最大连接数.
如果MaxOpenConns大于0但小于新的MaxIdleConns,则新的MaxIdleConns将减少以匹配MaxOpenConns限制
如果n <= 0,则不保留空闲连接.
SetMaxOpenConns
SetMaxOpenConns设置数据库的最大打开连接数.
如果MaxIdleConns大于0且新的MaxOpenConns小于MaxIdleConns,则MaxIdleConns将减小以匹配新的MaxOpenConns限制
如果n <= 0,则打开连接数没有限制.默认值为0(无限制).
为什么有两种功能,但不是一个单一的功能调整空闲的,开放连接好像MaxConns是MaxIdleConns + MaxOpenConns.为什么开发人员必须安排有多少开放和空闲的conn而不是定义总池?
db池可能包含0个或多个到数据库的空闲连接.这些是制作,使用而非封闭的连接,以备将来使用.我们可以保留的数量是MaxIdleConns.
当您请求其中一个空闲连接时,它将成为一个Open连接,供您使用.你可以使用的数量是MaxOpenConns.
现在,没有任何空闲连接比最大允许打开连接没有意义,因为如果您可以即时获取所有允许的打开连接,则保持空闲连接将始终保持空闲状态.这就像拥有一条有四条车道的桥梁,但只允许三辆车同时驶过它.
因此,我们希望确保这一点
MaxIdleConns <= MaxOpenConns
Run Code Online (Sandbox Code Playgroud)
编写函数是为了保留这个不变量,MaxIdleConns只要它超过它就会减少MaxOpenConns.请注意,文档说,只会MaxIdleConns减少匹配MaxOpenConns,后者永远不会成立.
要回答开发人员为什么要单独调整这些问题的问题:考虑应用程序通常很安静的情况,但偶尔需要打开大量连接.您可能希望指定一个大的MaxOpenConns,但非常小的MaxIdleConns,以确保您的应用程序可以在需要时打开所需的多个连接,但是快速释放这些资源,为自身和数据库释放内存.保持空闲连接是不可用的,并且通常是因为您希望很快将其转换为可用连接.
所以这里有两个数字的原因是这两个参数你可能有充分的理由单独变化.当然,API的语义意味着如果你不关心设置这两个值,你可以设置你关心的那个,这可能是MaxOpenConns