现象
开发时,控制台时不时的打印:
DruidAbstractDataSource: discard long time none received connection.
原因
反编译com.alibaba.druid.pool.DruidAbstractDataSource
类,
if (this.validConnectionChecker != null) {
valid = this.validConnectionChecker.isValidConnection(conn, this.validationQuery, this.validationQueryTimeout);
//......
if (valid && this.isMySql) {
long lastPacketReceivedTimeMs = MySqlUtils.getLastPacketReceivedTimeMs(conn);
if (lastPacketReceivedTimeMs > 0L) {
long mysqlIdleMillis = currentTimeMillis - lastPacketReceivedTimeMs;
if (lastPacketReceivedTimeMs > 0L && mysqlIdleMillis >= this.timeBetweenEvictionRunsMillis) {
this.discardConnection(holder);
String errorMsg = "discard long time none received connection. , jdbcUrl : " + this.jdbcUrl + ", version : " + VERSION.getVersionNumber() + ", lastPacketReceivedIdleMillis : " + mysqlIdleMillis;
LOG.warn(errorMsg);
boolean var13 = false;
return var13;
}
}
}
//.......
}
这句话在第10行
,
再查看变量valid
的赋值代码,反编译com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker
类
public MySqlValidConnectionChecker() {
//......
this.configFromProperties(System.getProperties());
}
public void configFromProperties(Properties properties) {
String property = properties.getProperty("druid.mysql.usePingMethod");
if ("true".equals(property)) {
this.setUsePingMethod(true);
} else if ("false".equals(property)) {
this.setUsePingMethod(false);
}
}
解决办法
- 设置环境变量
druid.mysql.usePingMethod
为false
,其中的一种方法是:@PostConstruct public void init() { System.setProperty("druid.mysql.usePingMethod", "false"); }
- 配置日志打印级别
logging:
level:
com.alibaba.druid.pool.DruidAbstractDataSource: error
思考
this.discardConnection(holder);
Druid主动释放了连接池中的连接,顺手打印个警告日志。