连接池是怎么判断一条连接是Idle状态的?

就是通过这两个参数进行判断的

  • minEvictableIdleTimeMillis:最小空闲时间 单位毫秒,默认30分钟。
    如果连接池中空闲的连接数大于minIdle(最小空闲连接数),并且那部分连接的空闲时间大于minEvictableIdleTimeMillis(最小空闲时间),
    则连接池会将那部分连接设置成Idle状态并关闭,也就是说如果一条连接30分钟都没有使用到,并且这种连接的数量超过了minIdle,则这些连接就会被关闭了。

    maxEvictableIdleTimeMillis:最大空闲时间 单位毫秒,默认7小时
    如果minIdle(最小空闲连接数)设置得比较大,连接池中的空闲连接数一直没有超过minIdle,这时那些空闲连接是不是一直不用关闭?当然不是,
    如果连接太久没用,数据库也会把它关闭,这时如果连接池不把这条连接关闭,系统就会拿到一条已经被数据库关闭的连接。为了避免这种情况,
    Druid会判断池中的连接如果空闲时间大于maxEvictableIdleTimeMillis,也会强行把它关闭,而不用判断空闲连接数是否小于minIdle;

这两参数是怎么起作用的?

这两参数是在DestroyTask的shrink方法中用来判断连接是不是应该被关闭的。

                    //关闭条件,空闲时间大于minEvictableIdleTimeMillis,并且空闲连接大于minIdle,
                    // 其中checkCount为poolingCount - minIdle,即可能被关闭的连接数量
                    //或者空闲时间大于maxEvictableIdleTimeMillis
                    if (idleMillis >= minEvictableIdleTimeMillis) {
                        if (checkTime && i < checkCount) {
                            evictConnections[evictCount++] = connection;
                            continue;
                        } else if (idleMillis > maxEvictableIdleTimeMillis) {
                            evictConnections[evictCount++] = connection;
                            continue;
                        }
                    }

总结

  • minEvictableIdleTimeMillis连接空闲时间大于该值并且池中空闲连接大于minIdle则关闭该连接
  • maxEvictableIdleTimeMillis连接空闲时间大于该值,不管minIdle都关闭该连接
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐