diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java b/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java index b6ae115c2c..6a834f2aac 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java @@ -35,61 +35,70 @@ import com.alibaba.druid.support.logging.LogFactory; public class DruidDataSourceFactory implements ObjectFactory { - private final static Log LOG = LogFactory.getLog(DruidDataSourceFactory.class); + private final static Log LOG = LogFactory.getLog(DruidDataSourceFactory.class); - static final int UNKNOWN_TRANSACTIONISOLATION = -1; + static final int UNKNOWN_TRANSACTIONISOLATION = -1; - public final static String PROP_DEFAULTAUTOCOMMIT = "defaultAutoCommit"; - public final static String PROP_DEFAULTREADONLY = "defaultReadOnly"; - public final static String PROP_DEFAULTTRANSACTIONISOLATION = "defaultTransactionIsolation"; - public final static String PROP_DEFAULTCATALOG = "defaultCatalog"; - public final static String PROP_DRIVERCLASSNAME = "driverClassName"; - public final static String PROP_MAXACTIVE = "maxActive"; - public final static String PROP_MAXIDLE = "maxIdle"; - public final static String PROP_MINIDLE = "minIdle"; - public final static String PROP_INITIALSIZE = "initialSize"; - public final static String PROP_MAXWAIT = "maxWait"; - public final static String PROP_TESTONBORROW = "testOnBorrow"; - public final static String PROP_TESTONRETURN = "testOnReturn"; - public final static String PROP_TIMEBETWEENEVICTIONRUNSMILLIS = "timeBetweenEvictionRunsMillis"; - public final static String PROP_NUMTESTSPEREVICTIONRUN = "numTestsPerEvictionRun"; - public final static String PROP_MINEVICTABLEIDLETIMEMILLIS = "minEvictableIdleTimeMillis"; - public final static String PROP_PHY_TIMEOUT_MILLIS = "phyTimeoutMillis"; - public final static String PROP_TESTWHILEIDLE = "testWhileIdle"; - public final static String PROP_PASSWORD = "password"; - public final static String PROP_URL = "url"; - public final static String PROP_USERNAME = "username"; - public final static String PROP_VALIDATIONQUERY = "validationQuery"; - public final static String PROP_VALIDATIONQUERY_TIMEOUT = "validationQueryTimeout"; + public final static String PROP_DEFAULTAUTOCOMMIT = "defaultAutoCommit"; + public final static String PROP_DEFAULTREADONLY = "defaultReadOnly"; + public final static String PROP_DEFAULTTRANSACTIONISOLATION = "defaultTransactionIsolation"; + public final static String PROP_DEFAULTCATALOG = "defaultCatalog"; + public final static String PROP_DRIVERCLASSNAME = "driverClassName"; + public final static String PROP_MAXACTIVE = "maxActive"; + public final static String PROP_MAXIDLE = "maxIdle"; + public final static String PROP_MINIDLE = "minIdle"; + public final static String PROP_INITIALSIZE = "initialSize"; + public final static String PROP_MAXWAIT = "maxWait"; + public final static String PROP_TESTONBORROW = "testOnBorrow"; + public final static String PROP_TESTONRETURN = "testOnReturn"; + public final static String PROP_TIMEBETWEENEVICTIONRUNSMILLIS = "timeBetweenEvictionRunsMillis"; + public final static String PROP_NUMTESTSPEREVICTIONRUN = "numTestsPerEvictionRun"; + public final static String PROP_MINEVICTABLEIDLETIMEMILLIS = "minEvictableIdleTimeMillis"; + public final static String PROP_PHY_TIMEOUT_MILLIS = "phyTimeoutMillis"; + public final static String PROP_TESTWHILEIDLE = "testWhileIdle"; + public final static String PROP_PASSWORD = "password"; + public final static String PROP_URL = "url"; + public final static String PROP_USERNAME = "username"; + public final static String PROP_VALIDATIONQUERY = "validationQuery"; + public final static String PROP_VALIDATIONQUERY_TIMEOUT = "validationQueryTimeout"; - public final static String PROP_INITCONNECTIONSQLS = "initConnectionSqls"; - public final static String PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED = "accessToUnderlyingConnectionAllowed"; - public final static String PROP_REMOVEABANDONED = "removeAbandoned"; - public final static String PROP_REMOVEABANDONEDTIMEOUT = "removeAbandonedTimeout"; - public final static String PROP_LOGABANDONED = "logAbandoned"; - public final static String PROP_POOLPREPAREDSTATEMENTS = "poolPreparedStatements"; - public final static String PROP_MAXOPENPREPAREDSTATEMENTS = "maxOpenPreparedStatements"; - public final static String PROP_CONNECTIONPROPERTIES = "connectionProperties"; - public final static String PROP_FILTERS = "filters"; - public final static String PROP_EXCEPTION_SORTER = "exceptionSorter"; - public final static String PROP_EXCEPTION_SORTER_CLASS_NAME = "exception-sorter-class-name"; - public final static String PROP_NAME = "name"; + public final static String PROP_INITCONNECTIONSQLS = "initConnectionSqls"; + public final static String PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED = "accessToUnderlyingConnectionAllowed"; + public final static String PROP_REMOVEABANDONED = "removeAbandoned"; + public final static String PROP_REMOVEABANDONEDTIMEOUT = "removeAbandonedTimeout"; + public final static String PROP_LOGABANDONED = "logAbandoned"; + public final static String PROP_POOLPREPAREDSTATEMENTS = "poolPreparedStatements"; + public final static String PROP_MAXOPENPREPAREDSTATEMENTS = "maxOpenPreparedStatements"; + public final static String PROP_CONNECTIONPROPERTIES = "connectionProperties"; + public final static String PROP_FILTERS = "filters"; + public final static String PROP_EXCEPTION_SORTER = "exceptionSorter"; + public final static String PROP_EXCEPTION_SORTER_CLASS_NAME = "exception-sorter-class-name"; + public final static String PROP_NAME = "name"; - public final static String PROP_INIT = "init"; + public final static String PROP_INIT = "init"; - private final static String[] ALL_PROPERTIES = { PROP_DEFAULTAUTOCOMMIT, + private final static String[] ALL_PROPERTIES = {PROP_DEFAULTAUTOCOMMIT, PROP_DEFAULTREADONLY, PROP_DEFAULTTRANSACTIONISOLATION, PROP_DEFAULTCATALOG, PROP_DRIVERCLASSNAME, PROP_MAXACTIVE, PROP_MAXIDLE, PROP_MINIDLE, PROP_INITIALSIZE, PROP_MAXWAIT, PROP_TESTONBORROW, PROP_TESTONRETURN, PROP_TIMEBETWEENEVICTIONRUNSMILLIS, PROP_NUMTESTSPEREVICTIONRUN, - PROP_MINEVICTABLEIDLETIMEMILLIS, PROP_TESTWHILEIDLE, PROP_PASSWORD, PROP_URL, PROP_USERNAME, + PROP_MINEVICTABLEIDLETIMEMILLIS, PROP_TESTWHILEIDLE, PROP_PASSWORD, PROP_FILTERS, PROP_URL, PROP_USERNAME, PROP_VALIDATIONQUERY, PROP_VALIDATIONQUERY_TIMEOUT, PROP_INITCONNECTIONSQLS, PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED, PROP_REMOVEABANDONED, PROP_REMOVEABANDONEDTIMEOUT, PROP_LOGABANDONED, PROP_POOLPREPAREDSTATEMENTS, PROP_MAXOPENPREPAREDSTATEMENTS, PROP_CONNECTIONPROPERTIES, - PROP_FILTERS, PROP_EXCEPTION_SORTER, PROP_EXCEPTION_SORTER_CLASS_NAME, PROP_INIT, PROP_NAME }; + PROP_EXCEPTION_SORTER, PROP_EXCEPTION_SORTER_CLASS_NAME, PROP_INIT, PROP_NAME, // + "druid.timeBetweenLogStatsMillis", // + "druid.stat.sql.MaxSize", // + "druid.clearFiltersEnable", // + "druid.resetStatEnable", // + "druid.notFullTimeoutRetryCount", // + "druid.maxWaitThreadCount", // + "druid.failFast", // + "druid.phyTimeoutMillis", // + }; @Override public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) - throws Exception { + throws Exception { // We only know how to deal with javax.naming.References // that specify a class name of "javax.sql.DataSource" @@ -99,8 +108,8 @@ public class DruidDataSourceFactory implements ObjectFactory { Reference ref = (Reference) obj; if ((!"javax.sql.DataSource".equals(ref.getClassName())) // - && (!"com.alibaba.druid.pool.DruidDataSource".equals(ref.getClassName())) // - ) { + && (!"com.alibaba.druid.pool.DruidDataSource".equals(ref.getClassName())) // + ) { return null; } @@ -135,8 +144,8 @@ public class DruidDataSourceFactory implements ObjectFactory { return dataSource; } - @SuppressWarnings({ "deprecation", "rawtypes" }) - public static void config(DruidDataSource dataSource, Map properties) throws SQLException { + @SuppressWarnings({"deprecation", "rawtypes"}) + public static void config(DruidDataSource dataSource, Map properties) throws SQLException { String value = null; value = (String) properties.get(PROP_DEFAULTAUTOCOMMIT); @@ -294,7 +303,7 @@ public class DruidDataSourceFactory implements ObjectFactory { if (value != null) { boolean poolPreparedStatements = Boolean.valueOf(value).booleanValue(); dataSource.setPoolPreparedStatements(poolPreparedStatements); - + if (poolPreparedStatements) { value = (String) properties.get(PROP_MAXOPENPREPAREDSTATEMENTS); if (value != null) { @@ -329,6 +338,24 @@ public class DruidDataSourceFactory implements ObjectFactory { dataSource.setConnectionProperties(value); } + { + Properties dataSourceProperties = null; + for (Map.Entry entry : properties.entrySet()) { + String entryKey = (String) entry.getKey(); + if (entryKey.startsWith("druid.")) { + if (dataSourceProperties == null) { + dataSourceProperties = new Properties(); + } + + String entryValue = (String) entry.getValue(); + dataSourceProperties.put(entryKey, entryValue); + } + } + if (dataSourceProperties != null) { + dataSource.configFromPropety(dataSourceProperties); + } + } + value = (String) properties.get(PROP_INIT); if ("true".equals(value)) { dataSource.init();