1、简介
在本文中,我们将总结 testOnBorrow、testOnReturn、testWhileIdle 的异同。
2、环境
os-window10
druid-1.2.8
jdk-1.8.0_312
maven-3.8.1
复制代码
3、参数含义
testOnBorrow: 申请连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能。
testOnReturn: 归还连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能。
testWhileIdle: 建议配置为 true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,执行 validationQuery 检测连接是否有效。
以上解释来源:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8
其中文档可能一直没更新,关于其中 testOnBorrow、testWhileIdle 的默认值说明有与源码不符的部分如下:
testOnBorrow :文档默认值 true, 源码默认值 false
testWhileIdle :文档默认值 false, 源码默认值 true
关于 validationQuery 参数文档与源码的差异部分:
关于其中 validationQuery 为 null, testOnBorrow、testOnReturn、testWhileIdle 都不会起作用。的描述,通过源码分析,这句话并不完全正确,其中在 init() 方法中关于这几个参数的验证方法为 validationQueryCheck(),而在这个方法之前还执行了一个关键方法 initValidConnectionChecker()。
字面意思是初始化验证连接的检查器,源代码如下:
private void initValidConnectionChecker() {
if (this.validConnectionChecker != null) {
return;
}
String realDriverClassName = driver.getClass().getName();
// mysql 的检查器
if (JdbcUtils.isMySqlDriver(realDriverClassName)) {
this.validConnectionChecker = new MySqlValidConnectionChecker();
// oracle 的检查器
} else if (realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER)
|| realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER2)) {
this.validConnectionChecker = new OracleValidConnectionChecker();
// sql_server 的检查器
} else if (realDriverClassName.equals(JdbcConstants.SQL_SERVER_DRIVER)
|| realDriverClassName.equals(JdbcConstants.SQL_SERVER_DRIVER_SQLJDBC4)
|| realDriverClassName.equals(JdbcConstants.SQL_SERVER_DRIVER_JTDS)) {
this.validConnectionChecker = new MSSQLValidConnectionChecker();
// PostgreSql 的检查器
} else if (realDriverClassName.equals(JdbcConstants.POSTGRESQL_DRIVER)
|| realDriverClassName.equals(JdbcConstants.ENTERPRISEDB_DRIVER)
|| realDriverClassName.equals(JdbcConstants.POLARDB_DRIVER)) {
this.validConnectionChecker = new PGValidConnectionChecker();
}
}
复制代码
validationQueryCheck() 源码如下,主要是验证 testOnBorrow 、 testOnReturn 、 testWhileIdle 配置了 true, validationQuery 为 null, 则会打印错误信息: validationQuery not set 。 其中如果 validConnectionChecker != null 则不会进行这些验证。
private void validationQueryCheck() {
// testOnBorrow 、 testOnReturn 、 testWhileIdle 参数都为 false 则 return
if (!(testOnBorrow || testOnReturn || testWhileIdle)) {
return;
}
// validConnectionChecker 存在则 return
if (this.validConnectionChecker != null) {
return;
}
// validationQuery 参数不为空则 return
if (this.validationQuery != null && this.validationQuery.length() > 0) {
return;
}
String errorMessage = "";
if (testOnBorrow) {
errorMessage += "testOnBorrow is true, ";
}
if (testOnReturn) {
errorMessage += "testOnReturn is true, ";
}
if (testWhileIdle) {
errorMessage += "testWhileIdle is true, ";
}
LOG.error(errorMessage + "validationQuery not set");
}
复制代码
评论