From 8ef0c29a56a19521fba311f616e196d1e44f31b4 Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 6 Aug 2012 19:19:17 +0800 Subject: [PATCH] StatFilter refactor --- .../alibaba/druid/filter/stat/StatFilter.java | 16 +++++++++------- .../druid/pool/ha/MultiDataSourceConnection.java | 14 ++++++++++---- .../druid/proxy/jdbc/ConnectionProxy.java | 2 ++ .../druid/proxy/jdbc/ConnectionProxyImpl.java | 14 +++++++++++--- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java index c59b08cf28..c475aa61a1 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java @@ -227,17 +227,19 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { @Override public void connection_close(FilterChain chain, ConnectionProxy connection) throws SQLException { - long nowNano = System.nanoTime(); + if (connection.getCloseCount() == 0) { + long nowNano = System.nanoTime(); - dataSourceStat.getConnectionStat().incrementConnectionCloseCount(); + dataSourceStat.getConnectionStat().incrementConnectionCloseCount(); - JdbcConnectionStat.Entry connectionInfo = getConnectionInfo(connection); + JdbcConnectionStat.Entry connectionInfo = getConnectionInfo(connection); - long aliveNanoSpan = nowNano - connectionInfo.getEstablishNano(); + long aliveNanoSpan = nowNano - connectionInfo.getEstablishNano(); - JdbcConnectionStat.Entry existsConnection = dataSourceStat.getConnections().remove(connection.getId()); - if (existsConnection != null) { - dataSourceStat.getConnectionStat().afterClose(aliveNanoSpan); + JdbcConnectionStat.Entry existsConnection = dataSourceStat.getConnections().remove(connection.getId()); + if (existsConnection != null) { + dataSourceStat.getConnectionStat().afterClose(aliveNanoSpan); + } } chain.connection_close(connection); diff --git a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java index f5f1d51b2f..6e861fa192 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java @@ -50,7 +50,7 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect private Date connectedTime = null; - private boolean closed = false; + private int closeCount = 0; private TransactionInfo transcationInfo; @@ -167,21 +167,22 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect @Override public void close() throws SQLException { - if (closed) { + if (closeCount > 0) { + closeCount++; return; } if (conn != null) { conn.close(); } - this.closed = true; + this.closeCount++; multiDataSource.afterConnectionClosed(this); } @Override public boolean isClosed() throws SQLException { - return closed; + return closeCount > 0; } @Override @@ -663,4 +664,9 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect return null; } + @Override + public int getCloseCount() { + return closeCount; + } + } diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/ConnectionProxy.java b/src/main/java/com/alibaba/druid/proxy/jdbc/ConnectionProxy.java index 9148816562..c480f233fb 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/ConnectionProxy.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/ConnectionProxy.java @@ -33,4 +33,6 @@ public interface ConnectionProxy extends Connection, WrapperProxy { Date getConnectedTime(); TransactionInfo getTransactionInfo(); + + int getCloseCount(); } diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/ConnectionProxyImpl.java b/src/main/java/com/alibaba/druid/proxy/jdbc/ConnectionProxyImpl.java index 6d9438ec63..7f7eabd362 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/ConnectionProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/ConnectionProxyImpl.java @@ -55,6 +55,8 @@ public class ConnectionProxyImpl extends WrapperProxyImpl implements ConnectionP private TransactionInfo transcationInfo; + private int closeCount; + public ConnectionProxyImpl(DataSourceProxy dataSource, Connection connection, Properties properties, long id){ super(connection, id); this.dataSource = dataSource; @@ -95,12 +97,13 @@ public class ConnectionProxyImpl extends WrapperProxyImpl implements ConnectionP @Override public void close() throws SQLException { createChain().connection_close(this); + closeCount++; } @Override public void commit() throws SQLException { createChain().connection_commit(this); - + if (transcationInfo != null) { transcationInfo.setEndTimeMillis(); } @@ -275,7 +278,7 @@ public class ConnectionProxyImpl extends WrapperProxyImpl implements ConnectionP @Override public void rollback() throws SQLException { createChain().connection_rollback(this); - + if (transcationInfo != null) { transcationInfo.setEndTimeMillis(); } @@ -284,7 +287,7 @@ public class ConnectionProxyImpl extends WrapperProxyImpl implements ConnectionP @Override public void rollback(Savepoint savepoint) throws SQLException { createChain().connection_rollback(this, savepoint); - + if (transcationInfo != null) { transcationInfo.setEndTimeMillis(); } @@ -383,4 +386,9 @@ public class ConnectionProxyImpl extends WrapperProxyImpl implements ConnectionP public TransactionInfo getTransactionInfo() { return transcationInfo; } + + @Override + public int getCloseCount() { + return closeCount; + } }