diff --git a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java index 6df9fe9808..583d4c007f 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java @@ -9,7 +9,9 @@ import java.sql.Statement; import com.alibaba.druid.logging.Log; import com.alibaba.druid.logging.LogFactory; +import com.alibaba.druid.pool.PoolableConnection; import com.alibaba.druid.pool.ValidConnectionChecker; +import com.alibaba.druid.proxy.jdbc.ConnectionProxy; import com.alibaba.druid.util.DruidLoaderUtils; import com.alibaba.druid.util.JdbcUtils; @@ -37,27 +39,24 @@ public class MySqlValidConnectionChecker implements ValidConnectionChecker, Seri public boolean isValidConnection(Connection c, String valiateQuery, int validationQueryTimeout) { Connection conn = null; - if (clazz.isAssignableFrom(c.getClass())) { - conn = c; - } else { - try { - conn = (Connection) c.unwrap(clazz); - } catch (SQLException e) { - LOG.warn("Unexpected error in ping", e); - return false; - } - } - - // if there is a ping method then use it, otherwise just use a 'SELECT 1' statement - if (conn != null && driverHasPingMethod) { - try { - ping.invoke(conn); - return true; - } catch (Exception e) { - LOG.warn("Unexpected error in ping", e); - return false; + if (driverHasPingMethod) { + if (c instanceof PoolableConnection) { + c = ((PoolableConnection) c).getConnection(); } + if (c instanceof ConnectionProxy) { + c = ((ConnectionProxy) c).getConnectionRaw(); + } + + if (clazz.isAssignableFrom(c.getClass())) { + try { + ping.invoke(conn); + return true; + } catch (Exception e) { + LOG.warn("Unexpected error in ping", e); + return false; + } + } } Statement stmt = null; diff --git a/src/test/java/com/alibaba/druid/pool/benckmark/CaseKylin_Oracle.java b/src/test/java/com/alibaba/druid/pool/benckmark/CaseKylin_Oracle.java index 433ea3a952..97e0f418ac 100644 --- a/src/test/java/com/alibaba/druid/pool/benckmark/CaseKylin_Oracle.java +++ b/src/test/java/com/alibaba/druid/pool/benckmark/CaseKylin_Oracle.java @@ -29,7 +29,7 @@ public class CaseKylin_Oracle extends TestCase { private String validationQuery = null; // "SELECT 1"; private int threadCount = 15; private int TEST_COUNT = 3; - final int LOOP_COUNT = 1000 * 100; + final int LOOP_COUNT = 1000 * 10; private boolean testWhileIdle = true; private boolean testOnBorrow = true; private boolean testOnReturn = false; @@ -39,7 +39,7 @@ public class CaseKylin_Oracle extends TestCase { private long timeBetweenEvictionRunsMillis = 60000; private long minEvictableIdleTimeMillis = 1800000; private int numTestsPerEvictionRun = 20; - private String validateQuery = "SELECT @@SQL_MODE"; + private String validateQuery = "SELECT 1 FROM DUAL"; private String oracleDriverClass = "com.alibaba.china.jdbc.SimpleDriver"; @@ -70,6 +70,7 @@ public class CaseKylin_Oracle extends TestCase { public void druid() throws Exception { DruidDataSource dataSource = new DruidDataSource(); + dataSource.setFilters("encoding"); dataSource.setInitialSize(initialSize); dataSource.setMaxActive(maxActive); dataSource.setMaxIdle(maxIdle);