Druid空闲连接回收源码解析

Druid空闲连接回收源码解析

一、概念

(一) DestroyConnectionThread

DestroyConnectionThread负责回收空闲连接,但其中负责回收的代码在DestroyTask内。DestroyConnectionThread执行的时间间隔默认为60s,可以通过time-between-eviction-runs-millis属性修改,如果为0或者负数,时间间隔则为1s。

(二) DestroyTask

DestroyTask才是真正负责空闲线程的回收,符合以下两种条件的空闲连接会被DestroyTask清除:

1. 空闲连接数大于min-idle,且空闲时间大于min-evictable-idle-time-millis
2. 空闲时间大于max-evictable-idle-time-millis的连接

二、源码

//初始化方法
public void init() throws SQLException {
    [省略部分代码]
    //创建专门用于创建数据库连接的线程--与createAndStartDestroyThread()构成了很典型的生产者消费者
    createAndStartCreatorThread();
    //创建专门用于回收空闲连接的线程
    createAndStartDestroyThread();
    [省略部分代码]
}

protected void createAndStartDestroyThread() {
    destroyTask = new DestroyTask();
    [省略部分代码]
    destroyConnectionThread = new DestroyConnectionThread(threadName);
    destroyConnectionThread.start();
}

public class DestroyConnectionThread extends Thread {
    public DestroyConnectionThread(String name){
        super(name);
        this.setDaemon(true);
    }
    
    public void run() {
        [省略部分代码]
        //DestroyConnectionThread中最终回收连接的代码还是由DestroyTask来进行
        //此处是直接调用DestroyTask的run(),而不是通过start()异步调用
        destroyTask.run();
    }
}

public class DestroyTask implements Runnable {
    [省略部分代码]
    @Override
    public void run() {
        shrink(true, keepAlive);
        [省略部分代码]
    }
}

public void shrink(boolean checkTime, boolean keepAlive) {
    //空闲连接数与min-idle的差值
    final int checkCount = poolingCount - minIdle;
    //poolingCount--表示连接池中的空闲连接数目
    for (int i = 0; i < poolingCount; ++i) {
        //connections[]数组的元素都是空闲连接,初始化时候该数组直接初始化为maxActive大小
        //connections[]中的连接获取都是从后往前取,通过pollLast(long)或者takeLast()获取connections[--poolingCount],并将connections[poolingCount]置为null,由于空闲连接的获取使用是从后往前获取,所以释放过多空闲连接时只需要迭代connections[]的前poolingCount个元素。
        DruidConnectionHolder connection = connections[i];
        [省略部分代码]
        //当前空闲连接的空闲时长超过了min-evictable-idle-time-millis(连接最小空闲时间,默认为30分钟,单位为ms)时间
        if (idleMillis >= minEvictableIdleTimeMillis) {
            //空闲连接数大于min-idle,且空闲时间大于最小空闲时间min-evictable-idle-time-millis
            if (checkTime && i < checkCount) {
                evictConnections[evictCount++] = connection;
                continue;
            //空闲时长超过连接最大空闲时间max-evictable-idle-time-millis(连接最大空闲时间,默认为7小时,单位为ms),超过最大空闲时间的空闲连接都需要释放,不管当前空闲连接数是否大于最小空闲连接数min-idle
            //最大空闲时间max-evictable-idle-time-millis理论上要比最小空闲时间min-evictable-idle-time-millis大,如果小的话,druid初始化的日志中会出现警告warn
            } else if (idleMillis > maxEvictableIdleTimeMillis) {
                evictConnections[evictCount++] = connection;
                continue;
            }
        }  
        [省略部分代码]
    }
}               

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Druid是一种实时数据分析工具,而达梦是一种关系型数据库。Druid Wallfilter是一种用于连接Druid和达梦数据库的插件。 Druid Wallfilter插件的作用是在Druid查询中进行SQL墙过滤,它允许Druid直接连接到达梦数据库,从而可以在Druid中对达梦数据库中的数据进行实时分析和查询。使用Druid Wallfilter可以实现将达梦数据库中的数据导入到Druid中,以便进行更复杂和高效的数据处理和分析。 Druid Wallfilter连接到达梦数据库的过程相对简单。首先,需要在Druid的配置文件中添加达梦数据库的连接信息,包括数据库的地址、用户名、密码等。然后,在Druid的查询语句中使用特定的语法来指定连接到达梦数据库,并执行相应的SQL查询操作。Druid Wallfilter会自动将查询转换为达梦数据库可以理解的SQL语句,并将结果返回给Druid进行进一步处理和分析。 通过使用Druid Wallfilter连接达梦数据库,可以充分利用Druid的实时数据处理和分析能力,同时也可以充分发挥达梦数据库的数据存储和管理功能。这样,用户可以在Druid中进行复杂的数据查询和分析操作,同时又能够充分利用达梦数据库所提供的功能和特性,从而提升数据处理的性能和效率。 总而言之,Druid Wallfilter插件可以实现Druid与达梦数据库的连接,使得在Druid中对达梦数据库的数据进行实时查询和分析成为可能。通过合理配置和使用Druid Wallfilter,可以使得数据处理和分析过程更加高效和便捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值