diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 9cc8e1c7bb..e04405a53c 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -274,7 +274,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (isTestOnBorrow()) { boolean validate = testConnectionInternal(poolalbeConnection.getConnection()); if (!validate) { - LOG.debug("skip not validate connection."); + if (LOG.isDebugEnabled()) { + LOG.debug("skip not validate connection."); + } + Connection realConnection = poolalbeConnection.getConnection(); JdbcUtils.close(realConnection); continue; diff --git a/src/main/java/com/alibaba/druid/pool/ValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/ValidConnectionChecker.java index 30fcc87b88..4f41aee33b 100644 --- a/src/main/java/com/alibaba/druid/pool/ValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/ValidConnectionChecker.java @@ -3,5 +3,5 @@ package com.alibaba.druid.pool; import java.sql.Connection; public interface ValidConnectionChecker { - boolean isValidConnection(Connection c, String query, int validationQueryTimeout); + boolean isValidConnection(Connection c, String query, int validationQueryTimeout) ; } diff --git a/src/main/java/com/alibaba/druid/pool/vendor/MSSQLValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/MSSQLValidConnectionChecker.java index 08f4ba9ed3..a2aa16787c 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MSSQLValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MSSQLValidConnectionChecker.java @@ -21,6 +21,19 @@ public class MSSQLValidConnectionChecker implements ValidConnectionChecker, Seri private static final Log LOG = LogFactory.getLog(MSSQLValidConnectionChecker.class); public boolean isValidConnection(final Connection c, String valiateQuery, int validationQueryTimeout) { + try { + if (c.isClosed()) { + return false; + } + } catch (SQLException ex) { + // skip + return false; + } + + if (valiateQuery == null) { + return true; + } + Statement stmt = null; try { 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 c1cad974f1..5af4f81f45 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java @@ -36,19 +36,32 @@ public class MySqlValidConnectionChecker implements ValidConnectionChecker, Seri } } - public boolean isValidConnection(Connection c, String valiateQuery, int validationQueryTimeout) { + public boolean isValidConnection(Connection conn, String valiateQuery, int validationQueryTimeout) { + try { + if (conn.isClosed()) { + return false; + } + } catch (SQLException ex) { + // skip + return false; + } + + if (valiateQuery == null) { + return true; + } + if (driverHasPingMethod) { - if (c instanceof PoolableConnection) { - c = ((PoolableConnection) c).getConnection(); + if (conn instanceof PoolableConnection) { + conn = ((PoolableConnection) conn).getConnection(); } - if (c instanceof ConnectionProxy) { - c = ((ConnectionProxy) c).getConnectionRaw(); + if (conn instanceof ConnectionProxy) { + conn = ((ConnectionProxy) conn).getConnectionRaw(); } - if (clazz.isAssignableFrom(c.getClass())) { + if (clazz.isAssignableFrom(conn.getClass())) { try { - ping.invoke(c); + ping.invoke(conn); return true; } catch (Exception e) { LOG.warn("Unexpected error in ping", e); @@ -60,7 +73,7 @@ public class MySqlValidConnectionChecker implements ValidConnectionChecker, Seri Statement stmt = null; ResultSet rs = null; try { - stmt = c.createStatement(); + stmt = conn.createStatement(); stmt.setQueryTimeout(validationQueryTimeout); rs = stmt.executeQuery(valiateQuery); return true; diff --git a/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java index 926d896eaa..4b06066705 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java @@ -55,19 +55,32 @@ public class OracleValidConnectionChecker implements ValidConnectionChecker, Ser } } - public boolean isValidConnection(Connection c, String valiateQuery, int validationQueryTimeout) { + public boolean isValidConnection(Connection conn, String valiateQuery, int validationQueryTimeout) { try { - if (c instanceof PoolableConnection) { - c = ((PoolableConnection) c).getConnection(); + if (conn.isClosed()) { + return false; + } + } catch (SQLException ex) { + // skip + return false; + } + + if (valiateQuery == null) { + return true; + } + + try { + if (conn instanceof PoolableConnection) { + conn = ((PoolableConnection) conn).getConnection(); } - if (c instanceof ConnectionProxy) { - c = ((ConnectionProxy) c).getConnectionRaw(); + if (conn instanceof ConnectionProxy) { + conn = ((ConnectionProxy) conn).getConnectionRaw(); } // unwrap - if (clazz.isAssignableFrom(c.getClass())) { - Integer status = (Integer) ping.invoke(c, params); + if (clazz.isAssignableFrom(conn.getClass())) { + Integer status = (Integer) ping.invoke(conn, params); // Error if (status.intValue() < 0) { @@ -80,7 +93,7 @@ public class OracleValidConnectionChecker implements ValidConnectionChecker, Ser Statement stmt = null; ResultSet rs = null; try { - stmt = c.createStatement(); + stmt = conn.createStatement(); rs = stmt.executeQuery(valiateQuery); return true; } catch (SQLException e) { diff --git a/src/test/java/com/alibaba/druid/pool/benckmark/Case3.java b/src/test/java/com/alibaba/druid/pool/benckmark/Case3.java index 18079bd1f5..a494806859 100644 --- a/src/test/java/com/alibaba/druid/pool/benckmark/Case3.java +++ b/src/test/java/com/alibaba/druid/pool/benckmark/Case3.java @@ -47,15 +47,15 @@ public class Case3 extends TestCase { driverClass = "com.alibaba.druid.mock.MockDriver"; // connectionProperties = "connectSleep=3;executeSleep=1"; - jdbcUrl = "jdbc:mysql://10.20.153.104:3306/druid2"; - user = "root"; - password = "root"; - driverClass = "com.mysql.jdbc.Driver"; +// jdbcUrl = "jdbc:mysql://10.20.153.104:3306/druid2"; +// user = "root"; +// password = "root"; +// driverClass = "com.mysql.jdbc.Driver"; } public void test_perf() throws Exception { for (int i = 0; i < 5; ++i) { - druid(); +// druid(); dbcp(); // boneCP(); }