druid 启用心跳检测(keepAlive),数据库重启后池里的连接有效性检测不出来

at0kjp5o  于 2022-12-31  发布在  Druid
关注(0)|答案(2)|浏览(1474)

启用心跳检测(keepAlive),数据库重启后池里的连接有效性检测不出来,跟了下代码发现检测方式用的是ping的方式,检测类是MySqlValidConnectionChecker (mysql8),产生异常后各上抛的异常是InvocationTargetException , 但上层处理代码中会对异常做捕获,如果是SQLException就继续往上抛,如果是其它异常直接吞了,吞了之后认为检测是正常的,那些失效的连接就一直好好呆在池里。所以我觉着这可能是一个BUG,望核实,吞异常的代码片断如下:
`boolean result = true; //默认是true
Exception error = null;
try {
result = validConnectionChecker.isValidConnection(conn, validationQuery, validationQueryTimeout);
} catch (SQLException ex) {
throw ex; //SQLException 就会向上抛
} catch (Exception ex) {
error = ex;
// 这里吞异常应该是为了如果不确定的异常就不做处理,但是也让检测失效了
}

if (!result) {
SQLException sqlError = error != null ? //
new SQLException("validateConnection false", error) //
: new SQLException("validateConnection false");
throw sqlError;
}
return;`
############################
另外说下我现在用的处理方案,将默认处理连接检测的类重置成为了ValidConnectionCheckerAdapter :

连接有问题时它抛的是 CommunicationsException , 它的父类是 SQLException , 所以异常不会被吞

lx0bsm1f

lx0bsm1f1#

另外,异常被吞后,池中的Idle时间确是在一直在被刷新,所以testWhileIdle的检测也不起作用,又不想用效率低下的testOnBorrow ,也不想用在服务端设置启动参数重置“druid.mysql.usePingMethod”的办法,所以才用了上面重置ValidConnectionCheckerAdapter 办法。
这种状况下如果请求会调数据库的页面会报异常,然后这个连接会被干掉重建一个,但是池里其它的连接还是坏的。下一次请求如果请求到新建的OK,如果请求到坏的又是异常,类推。。。

相关问题