DruidCP源码阅读4 -- keepAlive保活机制

1、什么是keepAlive

先简单说一下keepAlive在服务架构上的工作模式

1、高可用的解决方案通常为:冗余+故障自动发现转移,当一台节点负责接收请求时,发生故障那么整个应用就停止了,这时候会启动多台服务器有一台作为master提供服务,其余的为backup,master会定期向backup发送心跳,证明master还活着。

2、那么每台服务器的ip肯定是不同的,这时候会有一个虚拟ip在master上,client发起的请求都是请求的这个虚拟ip,master宕机后,重新发起ARP广播,刷新mac地址,并且把虚拟ip给新选举成功的服务器上,这样就做到了高可用。

keepAlive保活机制目的就来保障整个集群的高可用性

那么,keepAlive思想在Druid连接池中是如何运用的?

2、keepAlive在Druid连接池中的作用

存活机制能够保证连接池中的连接是真实有效的连接,假如遇到特殊情况导致连接不可用时,keepAlive机制将无效连接进行驱逐。

开启keepAlive

// 一个连接在连接池中最小生存的时间

dataSurce.setMinEvictableIdleTimeMillis(60 * 1000);单位毫秒

// 开启keepAlive

dataSource.setKeepAlive(true);

当连接池中连接的空闲时间大于最小驱逐空闲时间,并且开启了keepAlive,那么就将该连接放入保活连接数组,并且对保活连接数组中的连接进行有效性检查。

先看DruidDataSource中的两个成员变量

// 存放检查需要抛弃的连接
private DruidConnectionHolder[] evictConnections;
// 用来存放需要连接检查的存活连接
private DruidConnectionHolder[] keepAliveConnections;

createAndStartdestroyThread()创建的destroytask线程

destroy守护线程无限循环destroyTask线程

@Override
public void run() {
    shrink(true, keepAlive);

    if (isRemoveAbandoned()) {
        removeAbandoned();
    }
}

关键方法shrink(true,keepAlive)

    public void shrink(boolean checkTime, boolean keepAlive) {
        try {
            lock.lockInterruptibly();
        } catch (InterruptedException e) {
            return;
        }

        // 是否需要填充,开启keepAlive并且池中可用连接数+正在使用连接 < minIdle时,needFile=true
        boolean needFill = false;
        // 驱逐连接数量
        int evictCount = 0;
        // 存活连接数量
        int keepAliveCount = 0;
        int fatalErrorIncrement = fatalErrorCount - fatalErrorCountLastShrink;
        fatalErrorCountLastShrink = fatalErrorCount;

        try {
            // 未init直接return
            if (!inited) {
                return;
            }

            // 池中可用连接数 - 最小连接数 = 待检查的连接数量
            // 检测连接存活有效性,也是从这批连接中进行检查
            final int checkCount = poolin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyc_2754

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值