From b7856ebc586d08c0fc41744a71571fb8557854fc Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 29 Dec 2011 07:58:25 +0800 Subject: [PATCH] add stat PreparedStatementCacheDeleteCount --- .../druid/pool/DruidAbstractDataSource.java | 9 ++ .../pool/DruidAbstractDataSourceMBean.java | 2 + .../alibaba/druid/pool/DruidDataSource.java | 1 + .../druid/pool/xa/XAPoolableConnection.java | 111 ++++++++++++++++++ .../stat/DruidDataSourceStatManager.java | 8 +- 5 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/pool/xa/XAPoolableConnection.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 594276a113..e0e848c66c 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -187,6 +187,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements protected final AtomicLong preparedStatementCount = new AtomicLong(); protected final AtomicLong closedPreparedStatementCount = new AtomicLong(); protected final AtomicLong cachedPreparedStatementCount = new AtomicLong(); + protected final AtomicLong cachedPreparedStatementDeleteCount = new AtomicLong(); protected final Histogram transactionHistogram = new Histogram( 10, @@ -254,6 +255,14 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements public void decrementCachedPreparedStatementCount() { cachedPreparedStatementCount.decrementAndGet(); } + + public void incrementCachedPreparedStatementDeleteCount() { + cachedPreparedStatementDeleteCount.incrementAndGet(); + } + + public long getCachedPreparedStatementDeleteCount() { + return cachedPreparedStatementDeleteCount.get(); + } public long getCachedPreparedStatementCount() { return cachedPreparedStatementCount.get(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java index 8a3c55cf8a..da47ffb04a 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java @@ -140,4 +140,6 @@ public interface DruidAbstractDataSourceMBean { long getClosedPreparedStatementCount(); long getCachedPreparedStatementCount(); + + long getCachedPreparedStatementDeleteCount(); } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index dcb88db565..cb232e3f57 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -180,6 +180,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat closedPreparedStatementCount.set(0); preparedStatementCount.set(0); transactionHistogram.reset(); + cachedPreparedStatementDeleteCount.set(0); } public boolean isEnable() { diff --git a/src/main/java/com/alibaba/druid/pool/xa/XAPoolableConnection.java b/src/main/java/com/alibaba/druid/pool/xa/XAPoolableConnection.java new file mode 100644 index 0000000000..9a18ad2fc0 --- /dev/null +++ b/src/main/java/com/alibaba/druid/pool/xa/XAPoolableConnection.java @@ -0,0 +1,111 @@ +package com.alibaba.druid.pool.xa; + +import java.sql.SQLException; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import javax.sql.XAConnection; +import javax.transaction.xa.XAException; +import javax.transaction.xa.XAResource; +import javax.transaction.xa.Xid; + +import com.alibaba.druid.logging.Log; +import com.alibaba.druid.logging.LogFactory; +import com.alibaba.druid.pool.ConnectionHolder; +import com.alibaba.druid.pool.PoolableConnection; + +public class XAPoolableConnection extends PoolableConnection implements XAResource { + + private final static Log LOG = LogFactory.getLog(XAPoolableConnection.class); + + protected final XAConnection xaConnection; + + protected final XAResource xaResource; + + protected Xid currentXid; + + private Lock stateLock = new ReentrantLock(); + + public XAPoolableConnection(ConnectionHolder holder, XAConnection xaConnection) throws SQLException{ + super(holder); + + this.xaConnection = xaConnection; + this.xaResource = xaConnection.getXAResource(); + } + + @Override + public void commit(Xid xid, boolean onePhase) throws XAException { + xaResource.commit(xid, onePhase); + } + + @Override + public void end(Xid xid, int arg1) throws XAException { + // TODO Auto-generated method stub + + } + + @Override + public void forget(Xid xid) throws XAException { + xaResource.forget(xid); + } + + @Override + public int getTransactionTimeout() throws XAException { + return xaResource.getTransactionTimeout(); + } + + @Override + public boolean isSameRM(XAResource other) throws XAException { + return xaResource.isSameRM(other); + } + + @Override + public int prepare(Xid xid) throws XAException { + return xaResource.prepare(xid); + } + + @Override + public Xid[] recover(int flag) throws XAException { + return xaResource.recover(flag); + } + + @Override + public void rollback(Xid xid) throws XAException { + xaResource.rollback(xid); + } + + @Override + public boolean setTransactionTimeout(int seconds) throws XAException { + return xaResource.setTransactionTimeout(seconds); + } + + @Override + public void start(Xid xid, int flags) throws XAException { + if (holder == null) { + throw new XAException("connection is closed"); + } + + try { + xaResource.start(xid, flags); + } catch (XAException e) { + // JBAS-3336 Connections that fail in enlistment should not be returned + // to the pool + if (isFailedXA(e.errorCode)) { + LOG.error("Start transaction failed for " + this); + } + + throw e; + } + + stateLock.lock(); + try { + currentXid = xid; + } finally { + stateLock.unlock(); + } + } + + private boolean isFailedXA(int errorCode) { + return (errorCode == XAException.XAER_RMERR || errorCode == XAException.XAER_RMFAIL); + } +} diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java index 77294e3f29..046aef8dcf 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java +++ b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java @@ -200,6 +200,8 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe map.put("RollbackCount", dataSource.getRollbackCount()); map.put("LastError", JMXUtils.getErrorCompositeData(dataSource.getLastError())); map.put("LastCreateError", JMXUtils.getErrorCompositeData(dataSource.getCreateError())); + map.put("PreparedStatementCacheDeleteCount", dataSource.getCachedPreparedStatementDeleteCount()); + map.put("Version", dataSource.getVersion()); return new CompositeDataSupport(rowType, map); } @@ -220,7 +222,8 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe SimpleType.BOOLEAN, SimpleType.LONG, SimpleType.LONG, SimpleType.LONG, SimpleType.STRING, // SimpleType.STRING, SimpleType.INTEGER, SimpleType.STRING, SimpleType.STRING, SimpleType.LONG, // SimpleType.LONG, SimpleType.LONG, SimpleType.LONG, SimpleType.LONG, SimpleType.LONG// - , SimpleType.LONG, SimpleType.LONG, JMXUtils.getThrowableCompositeType(), JMXUtils.getThrowableCompositeType() + , SimpleType.LONG, SimpleType.LONG, JMXUtils.getThrowableCompositeType(), JMXUtils.getThrowableCompositeType(), SimpleType.LONG // + , SimpleType.STRING // }; @@ -238,7 +241,8 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe "RemoveAbandonedCount", // "NotEmptyWaitCount", "NotEmptyWaitNanos", "ErrorCount", "ReusePreparedStatementCount", "StartTransactionCount", // - "CommitCount", "RollbackCount", "LastError", "LastCreateError" + "CommitCount", "RollbackCount", "LastError", "LastCreateError", "PreparedStatementCacheDeleteCount" // + , "Version" // };