diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index a28ba2a5aa..7848729ce4 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -414,6 +414,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat activeConnections.put(poolalbeConnection, new ActiveConnectionTraceInfo(poolalbeConnection, System.currentTimeMillis(), stackTrace)); + poolalbeConnection.setTraceEnable(true); } if (!this.isDefaultAutoCommit()) { @@ -530,10 +531,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat assert holder != null; - if (isRemoveAbandoned()) { + if (pooledConnection.isTraceEnable()) { ActiveConnectionTraceInfo oldInfo = activeConnections.remove(pooledConnection); if (oldInfo == null) { - LOG.warn("remove abandonded failed."); + LOG.warn("remove abandonded failed. activeConnections.size " + activeConnections.size()); } } @@ -615,6 +616,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat public void close() { lock.lock(); try { + if (!this.inited) { + return; + } + if (createConnectionThread != null) { createConnectionThread.interrupt(); } @@ -704,7 +709,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat notEmptyWaitThreadCount++; try { long startEstimate = estimate; - estimate = notEmpty.awaitNanos(estimate); // signal by recycle or creator + estimate = notEmpty.awaitNanos(estimate); // signal by + // recycle or + // creator notEmptyWaitCount++; notEmptyWaitNanos += (startEstimate - estimate); diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index 2920ee6d99..1de3cb8f5a 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -51,12 +51,13 @@ import com.alibaba.druid.util.TransactionInfo; */ public class PoolableConnection implements PooledConnection, Connection { - private final static Log LOG = LogFactory.getLog(PoolableConnection.class); + private final static Log LOG = LogFactory.getLog(PoolableConnection.class); protected Connection conn; protected ConnectionHolder holder; protected TransactionInfo transactionInfo; private final boolean dupCloseLogEnable; + private boolean traceEnable = false; public PoolableConnection(ConnectionHolder holder){ this.conn = holder.getConnection(); @@ -64,6 +65,14 @@ public class PoolableConnection implements PooledConnection, Connection { dupCloseLogEnable = holder.getDataSource().isDupCloseLogEnable(); } + public boolean isTraceEnable() { + return traceEnable; + } + + public void setTraceEnable(boolean traceEnable) { + this.traceEnable = traceEnable; + } + public SQLException handleException(Throwable t) throws SQLException { final ConnectionHolder holder = this.holder; @@ -84,7 +93,7 @@ public class PoolableConnection implements PooledConnection, Connection { if (this.isClosed()) { return; } - + PreparedStatement rawStatement = stmt.getRawPreparedStatement(); try { @@ -92,7 +101,7 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { LOG.error("clear parameter error", ex); } - + if (holder == null) { return; } @@ -130,11 +139,6 @@ public class PoolableConnection implements PooledConnection, Connection { return; } - DruidAbstractDataSource dataSource = holder.getDataSource(); - if (dataSource.isRemoveAbandoned()) { - dataSource.removeActiveConnection(this); - } - for (ConnectionEventListener listener : holder.getConnectionEventListeners()) { listener.connectionClosed(new ConnectionEvent(this)); } diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java index 1893477439..ec5760197d 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java +++ b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java @@ -93,9 +93,13 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe public synchronized static void remove(DruidDataSource dataSource) { ObjectName objectName = dataSources.remove(dataSource); + + if (objectName == null) { + objectName = dataSource.getObjectName(); + } if (objectName == null) { - LOG.error("unregister mbean failed."); + LOG.error("unregister mbean failed. url " + dataSource.getUrl()); return; } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_close_error.java b/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_close_error.java index 4a2f11ca37..f881f2176d 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_close_error.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_close_error.java @@ -30,7 +30,7 @@ public class TraceFilterTest_close_error extends TestCase { }; dataSource = new DruidDataSource(); - dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setUrl("jdbc:mock:TraceFilterTest_close_error"); dataSource.setDriver(driver); dataSource.setInitialSize(1); dataSource.setMaxActive(2); diff --git a/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_commit_error.java b/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_commit_error.java index 0a48e24291..aad3a9791b 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_commit_error.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_commit_error.java @@ -31,7 +31,7 @@ public class TraceFilterTest_commit_error extends TestCase { }; dataSource = new DruidDataSource(); - dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setUrl("jdbc:mock:TraceFilterTest_commit_error"); dataSource.setDriver(driver); dataSource.setInitialSize(1); dataSource.setMaxActive(2); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestConnectError.java b/src/test/java/com/alibaba/druid/bvt/pool/TestConnectError.java index 0326c027ed..8e19d46848 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestConnectError.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestConnectError.java @@ -47,7 +47,7 @@ public class TestConnectError extends TestCase { dataSource.setTimeBetweenEvictionRunsMillis(10); dataSource.setMinEvictableIdleTimeMillis(300 * 1000); dataSource.setMaxActive(20); - dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setUrl("jdbc:mock:TestConnectError"); }