druid的默认连接尝试逻辑:死犟死犟的,连不上就无限循环一直连。(但重试太多会占用过多网络资源和垃圾日志,还可能导致数据库账号被停用)
这个默认逻辑有违我的意图,我希望连接指定次数不行后,直接完全停止。
如要做到,要同时设置三个值:
-
connectionErrorRetryAttempts:尝试连接失败几次后,触发停止尝试判断? 这个值就是失败重试次数的配置,默认 1。 -
timeBetweenConnectErrorMillis:失败后等多久继续尝试连接,单位毫秒? 如果你不想无限循环,这个值请给一个大于0的值,默认 500。 -
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);
}