Alibaba Druid - 如何解决Druid连接失败后的无限重试?

751 阅读1分钟

druid的默认连接尝试逻辑:死犟死犟的,连不上就无限循环一直连。(但重试太多会占用过多网络资源和垃圾日志,还可能导致数据库账号被停用)

这个默认逻辑有违我的意图,我希望连接指定次数不行后,直接完全停止

如要做到,要同时设置三个值:

  1. connectionErrorRetryAttempts:尝试连接失败几次后,触发停止尝试判断? 这个值就是失败重试次数的配置,默认 1。

  2. timeBetweenConnectErrorMillis:失败后等多久继续尝试连接,单位毫秒? 如果你不想无限循环,这个值请给一个大于0的值,默认 500。

  3. breakAfterAcquireFailure:在尝试连接次数超过配置中ConnectionErrorRetryAttempts指定次数后,且timeBetweenConnectErrorMillis的值大于0的情况下,是否要停止循环? 这个值是停止循环的关键,默认false。不要循环请给true。

为什么还挺整的挺费劲的,请看简化后的源代码逻辑:

  while(true){
        ......
        errorCount++;
        if (errorCount > connectionErrorRetryAttempts && timeBetweenConnectErrorMillis > 0) {
            if (breakAfterAcquireFailure) break;
        }
        ......
    }

最终配置

private void configDataSource(DruidDataSource ds) {
    // 一次连接时,最大等待时间
    ds.setMaxWait(5 * 1000);
    // 下面这三个配置一起生效,作用是在尝试连接失败几次后停止尝试。(默认逻辑是连不上就无限次尝试)
    ds.setConnectionErrorRetryAttempts(2);
    ds.setTimeBetweenConnectErrorMillis(5000);
    ds.setBreakAfterAcquireFailure(true);
}