From a9c31ecdc2e0137f8b7990371668063fef3cb54c Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 2 Nov 2017 16:36:01 +0800 Subject: [PATCH] bug fixed for testWhileIdle. --- .../druid/pool/DruidAbstractDataSource.java | 26 ++++++++++--------- .../alibaba/druid/pool/DruidDataSource.java | 4 +++ .../com/alibaba/druid/util/MySqlUtils.java | 4 +++ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 170092c3fd..1bddddb312 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -226,7 +226,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements protected volatile long lastCreateStartTimeMillis; protected boolean isOracle = false; - + protected boolean isMySql = false; protected boolean useOracleImplicitCache = true; protected ReentrantLock lock; @@ -1354,18 +1354,20 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements holder.lastValidTimeMillis = currentTimeMillis; } - if (valid && JdbcConstants.MYSQL_DRIVER.equals(driverClass)) { // unexcepted branch + if (valid && isMySql) { // unexcepted branch long lastPacketReceivedTimeMs = MySqlUtils.getLastPacketReceivedTimeMs(conn); - long mysqlIdleMillis = currentTimeMillis - lastPacketReceivedTimeMs; - if (lastPacketReceivedTimeMs > 0 // - && mysqlIdleMillis >= timeBetweenEvictionRunsMillis) { - discardConnection(conn); - String errorMsg = "discard long time none received connection. " - + ", jdbcUrl : " + jdbcUrl - + ", jdbcUrl : " + jdbcUrl - + ", lastPacketReceivedIdleMillis : " + mysqlIdleMillis; - LOG.error(errorMsg); - return false; + if (lastPacketReceivedTimeMs > 0) { + long mysqlIdleMillis = currentTimeMillis - lastPacketReceivedTimeMs; + if (lastPacketReceivedTimeMs > 0 // + && mysqlIdleMillis >= timeBetweenEvictionRunsMillis) { + discardConnection(conn); + String errorMsg = "discard long time none received connection. " + + ", jdbcUrl : " + jdbcUrl + + ", jdbcUrl : " + jdbcUrl + + ", lastPacketReceivedIdleMillis : " + mysqlIdleMillis; + LOG.error(errorMsg); + return false; + } } } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 53fb3ccbf8..27fc2cd4b2 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1082,6 +1082,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat oracleValidationQueryCheck(); } else if (JdbcUtils.DB2.equals(dbType)) { db2ValidationQueryCheck(); + } else if (JdbcUtils.MYSQL.equals(this.dbType) + || JdbcUtils.MYSQL_DRIVER_6.equals(this.dbType)) { + isMySql = true; } } @@ -1182,6 +1185,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER) // || realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER_6)) { this.exceptionSorter = new MySqlExceptionSorter(); + this.isMySql = true; } else if (realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER) || realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER2)) { this.exceptionSorter = new OracleExceptionSorter(); diff --git a/src/main/java/com/alibaba/druid/util/MySqlUtils.java b/src/main/java/com/alibaba/druid/util/MySqlUtils.java index 15537564bd..a715b3da49 100644 --- a/src/main/java/com/alibaba/druid/util/MySqlUtils.java +++ b/src/main/java/com/alibaba/druid/util/MySqlUtils.java @@ -293,6 +293,10 @@ public class MySqlUtils { try { Object connImpl = conn.unwrap(class_connectionImpl); + if (connImpl == null) { + return -1; + } + Object mysqlio = method_getIO.invoke(connImpl); Long ms = (Long) method_getLastPacketReceivedTimeMs.invoke(mysqlio); return ms.longValue();