数据库连接池的最小连接为什么是Idle语义

druid 的 minIdle -》 maxActive 和 hikariCP 的 minimumIdle -》 maximumPoolSize, 他们都是为了维护连接池内有足够的连接可用, 并且应对一定的流量突增; 这一点和线程池的 corePoolSize =》maxPoolSize 语义类似

执行逻辑

当前总连接数 = 池内连接数(空闲) + 活跃连接数

在总连接不超过 max 的前提下,如果池内空闲连接数 < minIdle , 则会去创建连接

线程池 ThreadPoolExecutor 里边的线程其实 worker角色, corePoolSize 这些线程是一直处于工作状态的,
而db连接池只是连接资源的容器,归还到db连接池内的连接就是空闲的,所以是 minIdle

一般建议 minimumIdle 和 maximumPoolSize 设置成一样大,因为db连接建立非常耗时;

比如hikariCP就直接建议不单独设置 minimumIdle,默认和max一样大
for maximum performance and responsiveness to spike demands, we recommend not setting this value and instead allowing HikariCP to act as a fixed size connection pool. Default: same as maximumPoolSize

可以把 minIdle 概念换成 minSize最小连接数(空闲+活跃)吗?

那么当前连接数小于 minSize 就直接判断需要创建新的连接; 当前连接数 == minSize后,如果再次申请连接,这个时候要去判断空闲状态的是否够用,不够用才去继续创建连接 直到 max; 从这个角度看是可以的

空闲超时检测,minSize 内和 min ~ max之间的时长区别,逻辑上也是可以

区别是,当较繁忙的时候 (active连接较多),minIdle 的判断逻辑会比minSize更早就去填充连接池 性能更优

总之,代码逻辑要和语义匹配

posted @ 2021-04-16 00:35  mushishi  阅读(1167)  评论(0编辑  收藏  举报