美文网首页
Druid配置参数详解-keepAlive

Druid配置参数详解-keepAlive

作者: codeimport | 来源:发表于2020-01-06 11:31 被阅读0次

    Druid配置参数详解-keepAlive

    Druid是一个由阿里开源的数据库连接池,Druid的配置非常丰富,但是设置不当会对生产环境造成严重影响,网上Druid的资料虽多,但大部分都是互相复制粘贴,有很多不准确甚至完全错误的描述,Druid已经开源很久,而且作者WenShao的工作重心也已经不在Druid上,有些功能估计他自己都不太了解了。本系列将从源代码的角度分析Druid目前的最新版本(1.1.21)各个常用的配置项的具体含义以及是怎么起作用的。

    画外音:目前Druid在开源中国举办的2019年度最受欢迎中国开源软件中排名第7名,支持Druid的朋友可以去投票哇。2019年度最受欢迎中国开源软件

    keepAlive是什么意思?

    keepAlive:保持连接的有效性,也就是跟数据库续租;

    keepAlive什么时候会起作用?

    当连接的空闲时间大于keepAliveBetweenTimeMillis(默认2分钟),但是小于minEvictableIdleTimeMillis(默认30分钟),Druid会通过调用validationQuery保持该连接的有效性。

    当连接空闲时间大于minEvictableIdleTimeMillis,Druid会直接将该连接关闭,keepAlive会无效。

    keepAlive在代码中是如何生效的?

    在DestroyTask的shrink方法中验证连接是否处于空闲状态,并判断是否需要保持该连接

    //如果空闲时间大于minEvictableIdleTimeMillis,则关闭该连接,keepAlive就会跳过
                        if (idleMillis >= minEvictableIdleTimeMillis) {
                            if (checkTime && i < checkCount) {
                                evictConnections[evictCount++] = connection;
                                continue;
                            } else if (idleMillis > maxEvictableIdleTimeMillis) {
                                evictConnections[evictCount++] = connection;
                                continue;
                            }
                        }
                        //如果空闲时间小于minEvictableIdleTimeMillis,但是大于keepAliveBetweenTimeMillis,则会保持连接有效性
                        if (keepAlive && idleMillis >= keepAliveBetweenTimeMillis) {
                            keepAliveConnections[keepAliveCount++] = connection;
                        }
    
                        //。。。。。。省略部分代码
    
        if (keepAliveCount > 0) {
                // keep order
                for (int i = keepAliveCount - 1; i >= 0; --i) {
                    DruidConnectionHolder holer = keepAliveConnections[i];
                    Connection connection = holer.getConnection();
                    holer.incrementKeepAliveCheckCount();
    
                    boolean validate = false;
                    try {//通过调用validateQuery保持连接的有效性
                        this.validateConnection(connection);
                        validate = true;
                    } catch (Throwable error) {
                        if (LOG.isDebugEnabled()) {
                            LOG.debug("keepAliveErr", error);
                        }
                        // skip
                    }
    
                    boolean discard = !validate;
                    if (validate) {
                        holer.lastKeepTimeMillis = System.currentTimeMillis();
                        boolean putOk = put(holer, 0L);
                        if (!putOk) {
                            discard = true;
                        }
                    }
                    //。。。。。。省略部分代码
                }
    }
    

    总结

    • keepAlive是Druid用来保持连接有效性的;
    • 只有空闲时间大于keepAliveBetweenTimeMillis并且小于minEvictableIdleTimeMillis该参数才会有用;

    相关文章

      网友评论

          本文标题:Druid配置参数详解-keepAlive

          本文链接:https://www.haomeiwen.com/subject/gcahactx.html