From cdabd396a4f7645bd861302aba14128da5e65ad2 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 29 Jun 2011 09:14:51 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ExceptionSorter?= 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@309 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../druid/pool/DruidAbstractDataSource.java | 36 ++++++++++------- .../alibaba/druid/pool/DruidDataSource.java | 1 + .../druid/pool/PoolableConnection.java | 39 ++++++++++++++++--- .../alibaba/druid/pool/PoolableStatement.java | 2 +- 4 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 602f1de799..8653bdeb3f 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -106,7 +106,7 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource protected PrintWriter logWriter = new PrintWriter(System.out); protected List filters = new ArrayList(); - protected List exceptionSoters = new ArrayList(); + protected ExceptionSorter exceptionSoter = null; protected Driver driver; @@ -142,6 +142,8 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource protected ValidConnectionChecker validConnectionChecker = null; + protected final AtomicLong errorCount = new AtomicLong(); + public ValidConnectionChecker getValidConnectionChecker() { return validConnectionChecker; } @@ -636,28 +638,28 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource this.driver = driver; } - public List getExceptionSoters() { - return exceptionSoters; + public ExceptionSorter getExceptionSoter() { + return exceptionSoter; } - public void setExceptionSoters(List exceptionSoters) { - this.exceptionSoters = exceptionSoters; + public void setExceptionSoter(ExceptionSorter exceptionSoter) { + this.exceptionSoter = exceptionSoter; } - public void setExceptionSoters(String exceptionSorters) throws Exception { - this.exceptionSoters.clear(); - - if (exceptionSorters == null || exceptionSorters.length() == 0) { + public void setExceptionSoter(String exceptionSorter) throws Exception { + if (exceptionSorter == null) { + this.exceptionSoter = null; return; } - String[] sorterArray = exceptionSorters.split("\\,"); - - for (String item : sorterArray) { - Class clazz = DruidLoaderUtils.loadClass(item); - ExceptionSorter sorter = (ExceptionSorter) clazz.newInstance(); - exceptionSoters.add(sorter); + exceptionSorter = exceptionSorter.trim(); + if (exceptionSorter.length() == 0) { + this.exceptionSoter = null; + return; } + + Class clazz = DruidLoaderUtils.loadClass(exceptionSorter); + this.exceptionSoter = (ExceptionSorter) clazz.newInstance(); } @Override @@ -805,6 +807,10 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource } } + protected void handleException(Throwable e) throws SQLException { + errorCount.incrementAndGet(); + } + protected abstract void recycle(PoolableConnection pooledConnection) throws SQLException; abstract void incrementCreateCount(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 034da9b70d..c282ed9e13 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -265,6 +265,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat return poolalbeConnection; } + /** * 回收连接 */ diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index 73933187a5..633b1cc4d6 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -40,6 +40,7 @@ import javax.sql.StatementEventListener; import com.alibaba.druid.pool.PoolablePreparedStatement.PreparedStatementKey; import com.alibaba.druid.pool.PreparedStatementPool.MethodType; +import com.alibaba.druid.pool.vendor.ExceptionSorter; /** * @author wenshao @@ -54,12 +55,40 @@ public class PoolableConnection implements PooledConnection, Connection { this.holder = holder; } - protected SQLException checkException(Throwable t) throws SQLException { - //if (mc != null) mc.connectionError(t); - + protected SQLException handleException(Throwable t) throws SQLException { + final ConnectionHolder holder = this.holder; + + // + if (holder != null) { + DruidAbstractDataSource dataSource = holder.getDataSource(); + if (dataSource != null) { + holder.getDataSource().handleException(t); + } + } + if (t instanceof SQLException) { - throw (SQLException) t; - } else { + SQLException sqlEx = (SQLException) t; + + // broadcastConnectionError + ConnectionEvent event = new ConnectionEvent(this, sqlEx); + for (ConnectionEventListener eventListener : holder.getConnectionEventListeners()) { + eventListener.connectionErrorOccurred(event); + } + + // exceptionSorter.isExceptionFatal + if (holder != null) { + DruidAbstractDataSource dataSource = holder.getDataSource(); + + if (dataSource != null) { + ExceptionSorter exceptionSorter = dataSource.getExceptionSoter(); + if (exceptionSorter != null && exceptionSorter.isExceptionFatal(sqlEx)) { + this.holder = null; // isClosed() is true + } + } + } + + throw sqlEx; + } else { throw new SQLException("Error", t); } } diff --git a/src/main/java/com/alibaba/druid/pool/PoolableStatement.java b/src/main/java/com/alibaba/druid/pool/PoolableStatement.java index 1f219524d9..49125db5c2 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableStatement.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableStatement.java @@ -38,7 +38,7 @@ public class PoolableStatement extends PoolableWrapper implements Statement { } protected SQLException checkException(Throwable error) throws SQLException { - return conn.checkException(error); + return conn.handleException(error); } public PoolableConnection getPoolableConnection() {