diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 093e1e5efc..7b5ee2d68f 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -108,7 +108,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements protected volatile String password; protected volatile String jdbcUrl; protected volatile String driverClass; - protected volatile Properties connectionProperties = new Properties(); + protected volatile Properties connectProperties = new Properties(); protected volatile PasswordCallback passwordCallback; protected volatile NameCallback userCallback; @@ -511,7 +511,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements throw new UnsupportedOperationException(); } - connectionProperties.put(name, value); + connectProperties.put(name, value); } public Collection getConnectionInitSqls() { @@ -882,24 +882,14 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } public Properties getConnectProperties() { - return connectionProperties; + return connectProperties; } - - public void setConnectProperties(Properties connectionProperties) { - if (inited) { - throw new UnsupportedOperationException(); - } - - this.connectionProperties = connectionProperties; - } - + + public abstract void setConnectProperties(Properties properties); + public void setConnectionProperties(String connectionProperties) { - if (inited) { - throw new UnsupportedOperationException(); - } - - if (connectionProperties == null) { - this.connectionProperties.clear(); + if (connectionProperties == null || connectionProperties.trim().length() == 0) { + setConnectProperties(null); return; } @@ -919,7 +909,8 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } } } - this.connectionProperties = properties; + + setConnectProperties(properties); } public String getUrl() { @@ -1554,7 +1545,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements to.password = this.password; to.jdbcUrl = this.jdbcUrl; to.driverClass = this.driverClass; - to.connectionProperties = this.connectionProperties; + to.connectProperties = this.connectProperties; to.passwordCallback = this.passwordCallback; to.userCallback = this.userCallback; to.initialSize = this.initialSize; diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 28eff22565..53bc1426c9 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -285,6 +285,20 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat lock.unlock(); } } + + public void setConnectProperties(Properties properties) { + if (properties == null) { + properties = new Properties(); + } + + if (inited) { + if (!this.connectProperties.equals(properties)) { + LOG.info("connectProperties changed : " + this.connectProperties + " -> " + properties); + } + } + + this.connectProperties = properties; + } public boolean isInited() { return this.inited; @@ -420,8 +434,11 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat throw new SQLException(e.getMessage(), e); } finally { inited = true; - lock.unlock(); + + if (LOG.isInfoEnabled()) { + LOG.info("{dataSource-" + this.getID() + "} inited"); + } } } @@ -742,7 +759,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (pooledConnection.isTraceEnable()) { ActiveConnectionTraceInfo oldInfo = activeConnections.remove(pooledConnection); if (oldInfo == null) { - LOG.warn("remove abandonded failed. activeConnections.size " + activeConnections.size()); + if (LOG.isWarnEnabled()) { + LOG.warn("remove abandonded failed. activeConnections.size " + activeConnections.size()); + } } } @@ -897,7 +916,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat lock.unlock(); } - LOG.warn("dataSource " + this.getID() + " closed"); + if (LOG.isInfoEnabled()) { + LOG.info("{dataSource-" + this.getID() + "} closed"); + } } void incrementCreateCount() { @@ -1328,11 +1349,11 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } public String getProperties() { - if (this.connectionProperties == null) { + if (this.connectProperties == null) { return null; } - Properties properties = new Properties(this.connectionProperties); + Properties properties = new Properties(this.connectProperties); if (properties.contains("password")) { properties.put("password", "******"); } diff --git a/src/main/java/com/alibaba/druid/pool/vendor/MSSQLValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/MSSQLValidConnectionChecker.java index 149e20dfc4..876985de1d 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MSSQLValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MSSQLValidConnectionChecker.java @@ -42,7 +42,9 @@ public class MSSQLValidConnectionChecker implements ValidConnectionChecker, Seri stmt.execute(QUERY); return true; } catch (SQLException e) { - LOG.warn("warning: connection validation failed for current managed connection."); + if (LOG.isWarnEnabled()) { + LOG.warn("warning: connection validation failed for current managed connection."); + } return false; } finally { JdbcUtils.close(stmt); diff --git a/src/main/java/com/alibaba/druid/support/logging/JakartaCommonsLoggingImpl.java b/src/main/java/com/alibaba/druid/support/logging/JakartaCommonsLoggingImpl.java index b4e96dfc68..4a15b29467 100644 --- a/src/main/java/com/alibaba/druid/support/logging/JakartaCommonsLoggingImpl.java +++ b/src/main/java/com/alibaba/druid/support/logging/JakartaCommonsLoggingImpl.java @@ -8,6 +8,8 @@ public class JakartaCommonsLoggingImpl implements com.alibaba.druid.support.logg private Log log; private int errorCount; + private int warnCount; + private int infoCount; public JakartaCommonsLoggingImpl(Class clazz){ log = LogFactory.getLog(clazz); @@ -37,21 +39,29 @@ public class JakartaCommonsLoggingImpl implements com.alibaba.druid.support.logg public void warn(String s) { log.warn(s); + warnCount++; } @Override public void warn(String s, Throwable e) { log.warn(s, e); + warnCount++; + } + + @Override + public int getWarnCount() { + return warnCount; } public int getErrorCount() { return errorCount; } - @Override public void resetStat() { errorCount = 0; + warnCount = 0; + infoCount = 0; } @Override @@ -62,5 +72,16 @@ public class JakartaCommonsLoggingImpl implements com.alibaba.druid.support.logg @Override public void info(String msg) { log.info(msg); + infoCount++; + } + + @Override + public int getInfoCount() { + return infoCount; + } + + @Override + public boolean isWarnEnabled() { + return log.isWarnEnabled(); } } diff --git a/src/main/java/com/alibaba/druid/support/logging/Jdk14LoggingImpl.java b/src/main/java/com/alibaba/druid/support/logging/Jdk14LoggingImpl.java index 6c518803c6..caee08f7a6 100644 --- a/src/main/java/com/alibaba/druid/support/logging/Jdk14LoggingImpl.java +++ b/src/main/java/com/alibaba/druid/support/logging/Jdk14LoggingImpl.java @@ -6,8 +6,10 @@ import java.util.logging.Logger; public class Jdk14LoggingImpl implements Log { private Logger log; - - private int errorCount; + + private int errorCount; + private int warnCount; + private int infoCount; public Jdk14LoggingImpl(Class clazz){ log = Logger.getLogger(clazz.toString()); @@ -37,21 +39,29 @@ public class Jdk14LoggingImpl implements Log { public void warn(String s) { log.log(Level.WARNING, s); + warnCount++; } @Override public void warn(String s, Throwable e) { log.log(Level.WARNING, s, e); + warnCount++; + } + + @Override + public int getWarnCount() { + return warnCount; } public int getErrorCount() { return errorCount; } - @Override public void resetStat() { errorCount = 0; + warnCount = 0; + infoCount = 0; } @Override @@ -62,5 +72,16 @@ public class Jdk14LoggingImpl implements Log { @Override public void info(String msg) { log.info(msg); + infoCount++; + } + + @Override + public int getInfoCount() { + return infoCount; + } + + @Override + public boolean isWarnEnabled() { + return log.isLoggable(Level.WARNING); } } diff --git a/src/main/java/com/alibaba/druid/support/logging/Log.java b/src/main/java/com/alibaba/druid/support/logging/Log.java index 4f9544c83d..d6458e0086 100644 --- a/src/main/java/com/alibaba/druid/support/logging/Log.java +++ b/src/main/java/com/alibaba/druid/support/logging/Log.java @@ -16,11 +16,17 @@ public interface Log { void debug(String msg, Throwable e); + boolean isWarnEnabled(); + void warn(String msg); void warn(String msg, Throwable e); int getErrorCount(); + int getWarnCount(); + + int getInfoCount(); + void resetStat(); } diff --git a/src/main/java/com/alibaba/druid/support/logging/Log4jImpl.java b/src/main/java/com/alibaba/druid/support/logging/Log4jImpl.java index b7cd194fed..add4cac022 100644 --- a/src/main/java/com/alibaba/druid/support/logging/Log4jImpl.java +++ b/src/main/java/com/alibaba/druid/support/logging/Log4jImpl.java @@ -1,5 +1,6 @@ package com.alibaba.druid.support.logging; +import org.apache.log4j.Level; import org.apache.log4j.Logger; public class Log4jImpl implements Log { @@ -7,6 +8,8 @@ public class Log4jImpl implements Log { private Logger log; private int errorCount; + private int warnCount; + private int infoCount; public Log4jImpl(Class clazz){ log = Logger.getLogger(clazz); @@ -34,10 +37,17 @@ public class Log4jImpl implements Log { public void warn(String s) { log.warn(s); + warnCount++; } public void warn(String s, Throwable e) { log.warn(s, e); + warnCount++; + } + + @Override + public int getWarnCount() { + return warnCount; } public int getErrorCount() { @@ -47,6 +57,8 @@ public class Log4jImpl implements Log { @Override public void resetStat() { errorCount = 0; + warnCount = 0; + infoCount = 0; } @Override @@ -56,6 +68,18 @@ public class Log4jImpl implements Log { @Override public void info(String msg) { + infoCount++; log.info(msg); } + + @Override + public boolean isWarnEnabled() { + return log.isEnabledFor(Level.WARN); + } + + @Override + public int getInfoCount() { + return infoCount; + } + } diff --git a/src/main/java/com/alibaba/druid/support/logging/NoLoggingImpl.java b/src/main/java/com/alibaba/druid/support/logging/NoLoggingImpl.java index 51d6761bff..6e695128c6 100644 --- a/src/main/java/com/alibaba/druid/support/logging/NoLoggingImpl.java +++ b/src/main/java/com/alibaba/druid/support/logging/NoLoggingImpl.java @@ -2,7 +2,9 @@ package com.alibaba.druid.support.logging; public class NoLoggingImpl implements Log { + private int infoCount; private int errorCount; + private int warnCount; public NoLoggingImpl(Class clazz){ } @@ -26,20 +28,28 @@ public class NoLoggingImpl implements Log { } public void warn(String s) { + warnCount++; } @Override public void warn(String s, Throwable e) { - + warnCount++; } public int getErrorCount() { return errorCount; } + @Override + public int getWarnCount() { + return warnCount; + } + @Override public void resetStat() { errorCount = 0; + warnCount = 0; + infoCount = 0; } @Override @@ -49,6 +59,15 @@ public class NoLoggingImpl implements Log { @Override public void info(String s) { - + infoCount++; + } + + @Override + public boolean isWarnEnabled() { + return false; + } + + public int getInfoCount() { + return infoCount; } } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/basic/DataSourceTest3.java b/src/test/java/com/alibaba/druid/bvt/pool/basic/DataSourceTest3.java index 39fdc97005..ebd7b12aba 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/basic/DataSourceTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/basic/DataSourceTest3.java @@ -33,7 +33,6 @@ public class DataSourceTest3 extends TestCase { dataSource.setDriver(driver); dataSource.setInitialSize(1); dataSource.setMaxActive(2); - dataSource.setMaxIdle(2); dataSource.setMinIdle(1); dataSource.setMinEvictableIdleTimeMillis(300 * 1000); // 300 / 10 dataSource.setTimeBetweenEvictionRunsMillis(180 * 1000); // 180 / 10 @@ -41,7 +40,7 @@ public class DataSourceTest3 extends TestCase { dataSource.setTestOnBorrow(true); dataSource.setTestOnReturn(true); dataSource.setValidationQuery("SELECT 1"); - dataSource.setFilters("stat,trace"); + dataSource.setFilters("stat"); JdbcStatContext context = new JdbcStatContext(); context.setTraceEnable(true); @@ -137,36 +136,20 @@ public class DataSourceTest3 extends TestCase { dataSource.setPassword("xx"); } - public void test_error_8() throws Exception { + public void test_change_connectProperties() throws Exception { DruidPooledConnection conn = dataSource.getConnection().unwrap(DruidPooledConnection.class); conn.close(); - { - Exception error = null; - try { - dataSource.setConnectProperties(new Properties()); - } catch (Exception ex) { - error = ex; - } - Assert.assertNotNull(error); - } + dataSource.setConnectProperties(new Properties()); } - public void test_error_9() throws Exception { + public void test_change_connectProperties_2() throws Exception { DruidPooledConnection conn = dataSource.getConnection().unwrap(DruidPooledConnection.class); conn.close(); - { - Exception error = null; - try { - dataSource.setConnectionProperties("x=12;;"); - } catch (Exception ex) { - error = ex; - } - Assert.assertNotNull(error); - } + dataSource.setConnectionProperties("x=12;;"); } public void test_getValidConnectionCheckerClassName() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/pool/dynamic/ConnectPropertiesChangeTest.java b/src/test/java/com/alibaba/druid/bvt/pool/dynamic/ConnectPropertiesChangeTest.java new file mode 100644 index 0000000000..0b3b0548b4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/dynamic/ConnectPropertiesChangeTest.java @@ -0,0 +1,56 @@ +package com.alibaba.druid.bvt.pool.dynamic; + +import java.lang.reflect.Field; +import java.sql.Connection; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.logging.Log; + +public class ConnectPropertiesChangeTest extends TestCase { + + private DruidDataSource dataSource; + + private Log dataSourceLog; + + protected void setUp() throws Exception { + Field logField = DruidDataSource.class.getDeclaredField("LOG"); + logField.setAccessible(true); + dataSourceLog = (Log) logField.get(null); + + dataSourceLog.resetStat(); + + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setTestOnBorrow(false); + dataSource.setConnectionProperties("a=3;b=4"); + dataSource.init(); + + Assert.assertEquals(1, dataSourceLog.getInfoCount()); + } + + protected void tearDown() throws Exception { + dataSource.close(); + } + + public void test_connectPropertiesChange() throws Exception { + Assert.assertEquals(2, dataSource.getConnectProperties().size()); + + Assert.assertEquals("3", dataSource.getConnectProperties().getProperty("a")); + Assert.assertEquals("4", dataSource.getConnectProperties().getProperty("b")); + + Connection conn = dataSource.getConnection(); + conn.close(); + + dataSource.setConnectionProperties("b=5;c=6"); + + Assert.assertEquals(2, dataSourceLog.getInfoCount()); + + Assert.assertEquals(2, dataSource.getConnectProperties().size()); + + Assert.assertEquals("5", dataSource.getConnectProperties().getProperty("b")); + Assert.assertEquals("6", dataSource.getConnectProperties().getProperty("c")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/MaxActiveChangeTest.java b/src/test/java/com/alibaba/druid/bvt/pool/dynamic/MaxActiveChangeTest.java similarity index 98% rename from src/test/java/com/alibaba/druid/bvt/pool/MaxActiveChangeTest.java rename to src/test/java/com/alibaba/druid/bvt/pool/dynamic/MaxActiveChangeTest.java index a7eef8e904..739a7568b0 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/MaxActiveChangeTest.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/dynamic/MaxActiveChangeTest.java @@ -1,4 +1,4 @@ -package com.alibaba.druid.bvt.pool; +package com.alibaba.druid.bvt.pool.dynamic; import java.sql.Connection;