From 69b7d0bb95cbb426bc16acc6f568daf6e991ef04 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 21 Jul 2011 06:38:18 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9OracleValidateConnectionCheck?= =?UTF-8?q?=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/druid/trunk@493 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../druid/pool/DruidAbstractDataSource.java | 15 ++++-- .../druid/pool/ValidConnectionChecker.java | 2 +- .../vendor/MSSQLValidConnectionChecker.java | 3 +- .../vendor/MySqlValidConnectionChecker.java | 5 +- .../vendor/OracleValidConnectionChecker.java | 49 ++++++++++++++----- .../pool/benckmark/CaseKylin_Oracle.java | 4 +- 6 files changed, 58 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index c5a61f7c91..b0cd135105 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -701,6 +701,13 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource throw new SQLException("validateConnection: connection closed"); } + if (validConnectionChecker != null) { + if (!validConnectionChecker.isValidConnection(conn, validationQuery, validationQueryTimeout)) { + throw new SQLException("validateConnection false"); + } + return; + } + if (null != query) { Statement stmt = null; ResultSet rset = null; @@ -731,23 +738,23 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource } } } - + public boolean testConnection(Connection conn) { if (conn instanceof PoolableConnection) { conn = ((PoolableConnection) conn).getConnection(); } - + if (conn instanceof ConnectionProxy) { conn = ((ConnectionProxy) conn).getConnectionRaw(); } - + return testConnectionInternal(conn); } protected boolean testConnectionInternal(Connection conn) { try { if (validConnectionChecker != null) { - return validConnectionChecker.isValidConnection(conn); + return validConnectionChecker.isValidConnection(conn, validationQuery, validationQueryTimeout); } String query = getValidationQuery(); diff --git a/src/main/java/com/alibaba/druid/pool/ValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/ValidConnectionChecker.java index 6a13b05ee0..30fcc87b88 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); + 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 2552ea5220..08f4ba9ed3 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MSSQLValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MSSQLValidConnectionChecker.java @@ -20,11 +20,12 @@ public class MSSQLValidConnectionChecker implements ValidConnectionChecker, Seri private static final String QUERY = "SELECT 1"; private static final Log LOG = LogFactory.getLog(MSSQLValidConnectionChecker.class); - public boolean isValidConnection(final Connection c) { + public boolean isValidConnection(final Connection c, String valiateQuery, int validationQueryTimeout) { Statement stmt = null; try { stmt = c.createStatement(); + stmt.setQueryTimeout(validationQueryTimeout); stmt.execute(QUERY); return true; } catch (SQLException e) { 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 f79c4115e8..6df9fe9808 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java @@ -34,7 +34,7 @@ public class MySqlValidConnectionChecker implements ValidConnectionChecker, Seri } } - public boolean isValidConnection(Connection c) { + public boolean isValidConnection(Connection c, String valiateQuery, int validationQueryTimeout) { Connection conn = null; if (clazz.isAssignableFrom(c.getClass())) { @@ -64,7 +64,8 @@ public class MySqlValidConnectionChecker implements ValidConnectionChecker, Seri ResultSet rs = null; try { stmt = c.createStatement(); - rs = stmt.executeQuery("SELECT 1"); + stmt.setQueryTimeout(validationQueryTimeout); + rs = stmt.executeQuery(valiateQuery); return true; } catch (SQLException e) { return false; 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 60bd755b9a..926d896eaa 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java @@ -24,11 +24,17 @@ package com.alibaba.druid.pool.vendor; import java.io.Serializable; import java.lang.reflect.Method; import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +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; public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable { @@ -49,21 +55,42 @@ public class OracleValidConnectionChecker implements ValidConnectionChecker, Ser } } - public boolean isValidConnection(Connection c) { + public boolean isValidConnection(Connection c, String valiateQuery, int validationQueryTimeout) { try { + if (c instanceof PoolableConnection) { + c = ((PoolableConnection) c).getConnection(); + } + + if (c instanceof ConnectionProxy) { + c = ((ConnectionProxy) c).getConnectionRaw(); + } + // unwrap - if (!clazz.isAssignableFrom(c.getClass())) { - Connection conn = (Connection) c.unwrap(clazz); - if (conn != null) { - c = conn; + if (clazz.isAssignableFrom(c.getClass())) { + Integer status = (Integer) ping.invoke(c, params); - Integer status = (Integer) ping.invoke(c, params); - - // Error - if (status.intValue() < 0) { - return false; - } + // Error + if (status.intValue() < 0) { + return false; } + + return true; + } + + Statement stmt = null; + ResultSet rs = null; + try { + stmt = c.createStatement(); + rs = stmt.executeQuery(valiateQuery); + return true; + } catch (SQLException e) { + return false; + } catch (Exception e) { + LOG.warn("Unexpected error in ping", e); + return false; + } finally { + JdbcUtils.close(rs); + JdbcUtils.close(stmt); } } catch (Exception e) { LOG.warn("Unexpected error in pingDatabase", e); 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 ed968b08ca..433ea3a952 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 @@ -40,6 +40,8 @@ public class CaseKylin_Oracle extends TestCase { private long minEvictableIdleTimeMillis = 1800000; private int numTestsPerEvictionRun = 20; private String validateQuery = "SELECT @@SQL_MODE"; + + private String oracleDriverClass = "com.alibaba.china.jdbc.SimpleDriver"; protected void setUp() throws Exception { // jdbcUrl = "jdbc:fake:dragoon_v25masterdb"; @@ -105,7 +107,7 @@ public class CaseKylin_Oracle extends TestCase { dataSource.setMinIdle(minIdle); dataSource.setMaxWait(maxWait); dataSource.setPoolPreparedStatements(true); - dataSource.setDriverClassName(driverClass); + dataSource.setDriverClassName(oracleDriverClass); dataSource.setUrl(jdbcUrl); dataSource.setPoolPreparedStatements(true); dataSource.setUsername(user);