From 91c276c92cea29fee6cd1352c4bfc129b2140d47 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 17 Jul 2011 05:34:30 +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@458 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../logging/JakartaCommonsLoggingImpl.java | 4 + .../druid/logging/Jdk14LoggingImpl.java | 4 + .../java/com/alibaba/druid/logging/Log.java | 2 + .../com/alibaba/druid/logging/Log4jImpl.java | 4 + .../alibaba/druid/logging/NoLoggingImpl.java | 3 + .../alibaba/druid/pool/DataSourceAdapter.java | 72 ++++++++++++++++++ .../alibaba/druid/pool/ha/HADataSource.java | 36 +++++++-- .../druid/pool/ha/MultiDataSource.java | 75 ++----------------- 8 files changed, 125 insertions(+), 75 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/pool/DataSourceAdapter.java diff --git a/src/main/java/com/alibaba/druid/logging/JakartaCommonsLoggingImpl.java b/src/main/java/com/alibaba/druid/logging/JakartaCommonsLoggingImpl.java index 2d35044531..fbb9e8214f 100644 --- a/src/main/java/com/alibaba/druid/logging/JakartaCommonsLoggingImpl.java +++ b/src/main/java/com/alibaba/druid/logging/JakartaCommonsLoggingImpl.java @@ -27,6 +27,10 @@ public class JakartaCommonsLoggingImpl implements com.alibaba.druid.logging.Log public void debug(String s) { log.debug(s); } + + public void debug(String s, Throwable e) { + log.debug(s, e); + } public void warn(String s) { log.warn(s); diff --git a/src/main/java/com/alibaba/druid/logging/Jdk14LoggingImpl.java b/src/main/java/com/alibaba/druid/logging/Jdk14LoggingImpl.java index e754072efe..2a893de74d 100644 --- a/src/main/java/com/alibaba/druid/logging/Jdk14LoggingImpl.java +++ b/src/main/java/com/alibaba/druid/logging/Jdk14LoggingImpl.java @@ -26,6 +26,10 @@ public class Jdk14LoggingImpl implements Log { public void debug(String s) { log.log(Level.FINE, s); } + + public void debug(String s, Throwable e) { + log.log(Level.FINE, s, e); + } public void warn(String s) { log.log(Level.WARNING, s); diff --git a/src/main/java/com/alibaba/druid/logging/Log.java b/src/main/java/com/alibaba/druid/logging/Log.java index cd015b83a0..ab599824b8 100644 --- a/src/main/java/com/alibaba/druid/logging/Log.java +++ b/src/main/java/com/alibaba/druid/logging/Log.java @@ -9,6 +9,8 @@ public interface Log { void error(String s); public void debug(String s); + + public void debug(String s, Throwable e); public void warn(String s); diff --git a/src/main/java/com/alibaba/druid/logging/Log4jImpl.java b/src/main/java/com/alibaba/druid/logging/Log4jImpl.java index 98d91c22da..981c8af9b7 100644 --- a/src/main/java/com/alibaba/druid/logging/Log4jImpl.java +++ b/src/main/java/com/alibaba/druid/logging/Log4jImpl.java @@ -25,6 +25,10 @@ public class Log4jImpl implements Log { public void debug(String s) { log.debug(s); } + + public void debug(String s, Throwable e) { + log.debug(s, e); + } public void warn(String s) { log.warn(s); diff --git a/src/main/java/com/alibaba/druid/logging/NoLoggingImpl.java b/src/main/java/com/alibaba/druid/logging/NoLoggingImpl.java index 1242a7393d..b34f98cdc4 100644 --- a/src/main/java/com/alibaba/druid/logging/NoLoggingImpl.java +++ b/src/main/java/com/alibaba/druid/logging/NoLoggingImpl.java @@ -17,6 +17,9 @@ public class NoLoggingImpl implements Log { public void debug(String s) { } + + public void debug(String s, Throwable e) { + } public void warn(String s) { } diff --git a/src/main/java/com/alibaba/druid/pool/DataSourceAdapter.java b/src/main/java/com/alibaba/druid/pool/DataSourceAdapter.java new file mode 100644 index 0000000000..3e58dca163 --- /dev/null +++ b/src/main/java/com/alibaba/druid/pool/DataSourceAdapter.java @@ -0,0 +1,72 @@ +package com.alibaba.druid.pool; + +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.SQLException; + +import javax.sql.DataSource; + +public class DataSourceAdapter implements DataSource { + private int loginTimeout = 0; + private PrintWriter logWriter = new PrintWriter(System.out); + + public DataSourceAdapter(){ + } + + @Override + public PrintWriter getLogWriter() throws SQLException { + return logWriter; + } + + @Override + public void setLogWriter(PrintWriter out) throws SQLException { + this.logWriter = out; + } + + @Override + public void setLoginTimeout(int seconds) throws SQLException { + loginTimeout = seconds; + } + + @Override + public int getLoginTimeout() throws SQLException { + return loginTimeout; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + if (iface == null) { + return false; + } + + if (iface.isInstance(this)) { + return true; + } + + return false; + } + + @SuppressWarnings("unchecked") + @Override + public T unwrap(Class iface) throws SQLException { + if (iface == null) { + return null; + } + + if (iface.isInstance(this)) { + return (T) this; + } + + return null; + } + + @Override + public Connection getConnection() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public Connection getConnection(String username, String password) throws SQLException { + throw new UnsupportedOperationException(); + } +} 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 958a9da9e9..a3d3d23818 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java @@ -2,7 +2,6 @@ package com.alibaba.druid.pool.ha; import java.sql.Connection; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicInteger; @@ -17,14 +16,14 @@ public class HADataSource extends MultiDataSource implements DataSource { private final static Log LOG = LogFactory.getLog(HADataSource.class); - private AtomicInteger requestCount = new AtomicInteger(); + private final AtomicInteger requestCount = new AtomicInteger(); + private final AtomicInteger indexErrorCount = new AtomicInteger(); protected final List notAvailableDatasources = new CopyOnWriteArrayList(); - - public HADataSource() { - super(new ArrayList()); + + public HADataSource(){ } - + @Override public Connection getConnection() throws SQLException { int tryCount = 0; @@ -32,15 +31,34 @@ public class HADataSource extends MultiDataSource implements DataSource { for (;;) { int size = dataSources.size(); + + if (size == 0) { + throw new SQLException("can not get connection, no availabe datasources"); + } + int index = requestNumber % size; - DruidDataSource dataSource = dataSources.get(index); + DruidDataSource dataSource = null; + + try { + // 处理并发时的错误 + dataSource = dataSources.get(index); + } catch (Exception ex) { + indexErrorCount.incrementAndGet(); + if (LOG.isDebugEnabled()) { + LOG.debug("getDataSource error, index : " + index, ex); + } + continue; + } + + assert dataSource != null; if (!dataSource.isEnable()) { boolean removed = dataSources.remove(dataSource); if (removed) { notAvailableDatasources.add(dataSource); } + continue; } Connection conn = null; @@ -62,4 +80,8 @@ public class HADataSource extends MultiDataSource implements DataSource { } } + public long getIndexErrorCount() { + return indexErrorCount.get(); + } + } diff --git a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java index 43d8165064..58904e272d 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java @@ -1,83 +1,22 @@ package com.alibaba.druid.pool.ha; -import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import javax.sql.DataSource; +import java.util.ArrayList; +import com.alibaba.druid.pool.DataSourceAdapter; import com.alibaba.druid.pool.DruidDataSource; -public abstract class MultiDataSource implements DataSource { +public abstract class MultiDataSource extends DataSourceAdapter { - protected final List dataSources; + protected ArrayList dataSources; - private int loginTimeout = 0; - private PrintWriter logWriter = new PrintWriter(System.out); - - public MultiDataSource() { - dataSources = new CopyOnWriteArrayList(); - } - - public MultiDataSource(List dataSources) { - this.dataSources = dataSources; - } - - public List getDataSources() { - return dataSources; + public MultiDataSource(){ + dataSources = new ArrayList(); } @Override - public PrintWriter getLogWriter() throws SQLException { - return logWriter; - } - - @Override - public void setLogWriter(PrintWriter out) throws SQLException { - this.logWriter = out; - } - - @Override - public void setLoginTimeout(int seconds) throws SQLException { - loginTimeout = seconds; - } - - @Override - public int getLoginTimeout() throws SQLException { - return loginTimeout; - } - - @Override - public boolean isWrapperFor(Class iface) throws SQLException { - if (iface == null) { - return false; - } - - if (iface.isInstance(this)) { - return true; - } - - return false; - } - - @SuppressWarnings("unchecked") - @Override - public T unwrap(Class iface) throws SQLException { - if (iface == null) { - return null; - } - - if (iface.isInstance(this)) { - return (T) this; - } - - return null; - } - - @Override - public Connection getConnection(String username, String password) throws SQLException { + public Connection getConnection() throws SQLException { throw new UnsupportedOperationException(); } }