diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 8c8d042afd..6a05416b49 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -38,6 +38,7 @@ import javax.sql.DataSource; import com.alibaba.druid.filter.Filter; import com.alibaba.druid.filter.FilterChainImpl; +import com.alibaba.druid.pool.vendor.ExceptionSorter; import com.alibaba.druid.proxy.jdbc.DataSourceProxy; import com.alibaba.druid.util.DruidLoaderUtils; @@ -46,20 +47,20 @@ import com.alibaba.druid.util.DruidLoaderUtils; */ public abstract class DruidAbstractDataSource implements DruidAbstractDataSourceMBean, DataSource, DataSourceProxy, Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - public final static int DEFAULT_INITIAL_SIZE = 0; - public final static int DEFAULT_MAX_ACTIVE_SIZE = 8; - public final static int DEFAULT_MAX_IDLE = 8; - public final static int DEFAULT_MIN_IDLE = 0; - public final static int DEFAULT_MAX_WAIT = -1; - public final static String DEFAULT_VALIDATION_QUERY = null; // - public final static boolean DEFAULT_TEST_ON_BORROW = true; - public final static boolean DEFAULT_TEST_ON_RETURN = false; - public final static boolean DEFAULT_WHILE_IDLE = false; - public static final long DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS = -1L; - public static final long DEFAULT_TIME_BETWEEN_CONNECT_ERROR_MILLIS = 30 * 1000; - public static final int DEFAULT_NUM_TESTS_PER_EVICTION_RUN = 1; + public final static int DEFAULT_INITIAL_SIZE = 0; + public final static int DEFAULT_MAX_ACTIVE_SIZE = 8; + public final static int DEFAULT_MAX_IDLE = 8; + public final static int DEFAULT_MIN_IDLE = 0; + public final static int DEFAULT_MAX_WAIT = -1; + public final static String DEFAULT_VALIDATION_QUERY = null; // + public final static boolean DEFAULT_TEST_ON_BORROW = true; + public final static boolean DEFAULT_TEST_ON_RETURN = false; + public final static boolean DEFAULT_WHILE_IDLE = false; + public static final long DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS = -1L; + public static final long DEFAULT_TIME_BETWEEN_CONNECT_ERROR_MILLIS = 30 * 1000; + public static final int DEFAULT_NUM_TESTS_PER_EVICTION_RUN = 1; /** * The default value for {@link #getMinEvictableIdleTimeMillis}. @@ -67,76 +68,77 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource * @see #getMinEvictableIdleTimeMillis * @see #setMinEvictableIdleTimeMillis */ - public static final long DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS = 1000L * 60L * 30L; + public static final long DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS = 1000L * 60L * 30L; - protected boolean defaultAutoCommit = false; - protected Boolean defaultReadOnly; - protected Integer defaultTransactionIsolation; - protected String defaultCatalog = null; + protected boolean defaultAutoCommit = false; + protected Boolean defaultReadOnly; + protected Integer defaultTransactionIsolation; + protected String defaultCatalog = null; - protected String name; + protected String name; - protected String username; - protected String password; - protected String jdbcUrl; - protected String driverClass; - protected Properties connectionProperties = new Properties(); + protected String username; + protected String password; + protected String jdbcUrl; + protected String driverClass; + protected Properties connectionProperties = new Properties(); - protected PasswordCallback passwordCallback; - protected NameCallback userCallback; + protected PasswordCallback passwordCallback; + protected NameCallback userCallback; - protected ConnectionFactory connectionFactory; + protected ConnectionFactory connectionFactory; - protected int initialSize = DEFAULT_INITIAL_SIZE; - protected int maxActive = DEFAULT_MAX_ACTIVE_SIZE; - protected int minIdle = DEFAULT_MIN_IDLE; - protected int maxIdle = DEFAULT_MAX_IDLE; - protected long maxWait = DEFAULT_MAX_WAIT; + protected int initialSize = DEFAULT_INITIAL_SIZE; + protected int maxActive = DEFAULT_MAX_ACTIVE_SIZE; + protected int minIdle = DEFAULT_MIN_IDLE; + protected int maxIdle = DEFAULT_MAX_IDLE; + protected long maxWait = DEFAULT_MAX_WAIT; - protected String validationQuery = DEFAULT_VALIDATION_QUERY; - protected int validationQueryTimeout = -1; - private boolean testOnBorrow = DEFAULT_TEST_ON_BORROW; - private boolean testOnReturn = DEFAULT_TEST_ON_RETURN; - private boolean testWhileIdle = DEFAULT_WHILE_IDLE; - protected boolean poolPreparedStatements = false; + protected String validationQuery = DEFAULT_VALIDATION_QUERY; + protected int validationQueryTimeout = -1; + private boolean testOnBorrow = DEFAULT_TEST_ON_BORROW; + private boolean testOnReturn = DEFAULT_TEST_ON_RETURN; + private boolean testWhileIdle = DEFAULT_WHILE_IDLE; + protected boolean poolPreparedStatements = false; - protected boolean inited = false; + protected boolean inited = false; - protected PrintWriter logWriter = new PrintWriter(System.out); + protected PrintWriter logWriter = new PrintWriter(System.out); - protected List filters = new ArrayList(); + protected List filters = new ArrayList(); + protected List exceptionSoters = new ArrayList(); - protected Driver driver; + protected Driver driver; - protected int queryTimeout; + protected int queryTimeout; - protected long createErrorCount; + protected long createErrorCount; - protected long createTimespan; + protected long createTimespan; - protected int maxWaitThreadCount = -1; + protected int maxWaitThreadCount = -1; - protected boolean accessToUnderlyingConnectionAllowed = true; + protected boolean accessToUnderlyingConnectionAllowed = true; - protected long timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; + protected long timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; - protected int numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN; + protected int numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN; - protected long minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; + protected long minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; - protected boolean removeAbandoned; + protected boolean removeAbandoned; - protected int removeAbandonedTimeout; + protected int removeAbandonedTimeout; - protected boolean logAbandoned; + protected boolean logAbandoned; - protected int maxOpenPreparedStatements = -1; + protected int maxOpenPreparedStatements = -1; - protected List connectionInitSqls; + protected List connectionInitSqls; - protected String dbType; + protected String dbType; - protected long timeBetweenConnectErrorMillis = DEFAULT_TIME_BETWEEN_CONNECT_ERROR_MILLIS; + protected long timeBetweenConnectErrorMillis = DEFAULT_TIME_BETWEEN_CONNECT_ERROR_MILLIS; protected ValidConnectionChecker validConnectionChecker = null; @@ -627,6 +629,30 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource this.driver = driver; } + public List getExceptionSoters() { + return exceptionSoters; + } + + public void setExceptionSoters(List exceptionSoters) { + this.exceptionSoters = exceptionSoters; + } + + public void setExceptionSoters(String exceptionSorters) throws Exception { + this.exceptionSoters.clear(); + + if (exceptionSorters == null || exceptionSorters.length() == 0) { + return; + } + + String[] sorterArray = exceptionSorters.split("\\,"); + + for (String item : sorterArray) { + Class clazz = DruidLoaderUtils.loadClass(item); + ExceptionSorter sorter = (ExceptionSorter) clazz.newInstance(); + exceptionSoters.add(sorter); + } + } + @Override public List getFilters() { return filters; @@ -697,11 +723,11 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource if (conn.isClosed()) { return false; } - + if (null == query) { return true; } - + Statement stmt = null; ResultSet rset = null; try { diff --git a/src/main/java/com/alibaba/druid/pool/ValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/ValidConnectionChecker.java index b64f4ef94f..6a13b05ee0 100644 --- a/src/main/java/com/alibaba/druid/pool/ValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/ValidConnectionChecker.java @@ -1,7 +1,6 @@ package com.alibaba.druid.pool; import java.sql.Connection; -import java.sql.SQLException; public interface ValidConnectionChecker { boolean isValidConnection(Connection c);