From 2c119c595b46ad4479ca032d4cbad6cf6abd8a7e Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 17 Jul 2011 04:52:52 +0000 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81HA?= 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@456 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../druid/pool/DruidAbstractDataSource.java | 15 ++++++- .../alibaba/druid/pool/DruidDataSource.java | 6 +-- .../druid/pool/PoolableConnection.java | 2 +- .../alibaba/druid/pool/ha/HADataSource.java | 42 +++++++++++++++---- 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 17b6d9634a..c5a61f7c91 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -39,6 +39,7 @@ import javax.sql.DataSource; import com.alibaba.druid.filter.Filter; import com.alibaba.druid.filter.FilterChainImpl; import com.alibaba.druid.pool.vendor.NullExceptionSorter; +import com.alibaba.druid.proxy.jdbc.ConnectionProxy; import com.alibaba.druid.proxy.jdbc.DataSourceProxy; import com.alibaba.druid.util.DruidLoaderUtils; import com.alibaba.druid.util.JdbcUtils; @@ -730,8 +731,20 @@ 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 testConnection(Connection conn) { + protected boolean testConnectionInternal(Connection conn) { try { if (validConnectionChecker != null) { return validConnectionChecker.isValidConnection(conn); diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 82092d4d8a..9cc8e1c7bb 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -272,7 +272,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat PoolableConnection poolalbeConnection = getConnectionInternal(); if (isTestOnBorrow()) { - boolean validate = testConnection(poolalbeConnection.getConnection()); + boolean validate = testConnectionInternal(poolalbeConnection.getConnection()); if (!validate) { LOG.debug("skip not validate connection."); Connection realConnection = poolalbeConnection.getConnection(); @@ -393,7 +393,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat // if (isTestOnReturn()) { - boolean validate = testConnection(conn); + boolean validate = testConnectionInternal(conn); if (!validate) { lock.lock(); try { @@ -753,7 +753,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } for (ConnectionHolder idleConnection : idleConnections) { - if (testConnection(idleConnection.getConnection())) { + if (testConnectionInternal(idleConnection.getConnection())) { connections[count++] = idleConnection; idleConnection.setLastActiveMillis(System.currentTimeMillis()); idleCheckCount++; diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index b27f9c4f59..5e776fd0fb 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -109,7 +109,7 @@ public class PoolableConnection implements PooledConnection, Connection { } @Override - public Connection getConnection() throws SQLException { + public Connection getConnection() { return conn; } diff --git a/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java b/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java index 7c3284a2eb..6c51ff9a58 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java @@ -6,24 +6,48 @@ import java.util.concurrent.atomic.AtomicInteger; import javax.sql.DataSource; +import com.alibaba.druid.logging.Log; +import com.alibaba.druid.logging.LogFactory; import com.alibaba.druid.pool.DruidDataSource; public class HADataSource extends MultiDataSource implements DataSource { - private AtomicInteger requestCount = new AtomicInteger(); + private final static Log LOG = LogFactory.getLog(HADataSource.class); + + private AtomicInteger requestCount = new AtomicInteger(); @Override public Connection getConnection() throws SQLException { - int requestNumber = requestCount.getAndIncrement(); - int size = dataSources.size(); - int index = requestNumber % size; + int tryCount = 0; + for (;;) { + int requestNumber = requestCount.getAndIncrement(); + int size = dataSources.size(); + int index = requestNumber % size; - DruidDataSource dataSource = dataSources.get(index); - Connection conn = dataSource.getConnection(); + DruidDataSource dataSource = dataSources.get(index); + Connection conn = null; - return conn; + try { + tryCount++; + conn = dataSource.getConnection(); + } catch (SQLException ex) { + LOG.error("getConnection error", ex); + + if (tryCount >= size) { + throw ex; + } + + continue; + } + + if (conn != null) { + if (!dataSource.isTestOnBorrow()) { + dataSource.testConnection(conn); + } + } + + return conn; + } } - - }