From 28aa217370e3ae35eda766f8528c3c8879c5686e Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 30 Jul 2012 22:07:45 +0800 Subject: [PATCH] add monitor api --- .../alibaba/druid/pool/DruidDataSource.java | 46 +++++++++++++++ src/test/java/com/alibaba/druid/DBCPTest.java | 58 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/DBCPTest.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 61347b267a..0abdec8ff8 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.ConcurrentModificationException; import java.util.Date; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; @@ -1386,6 +1387,51 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat return buf.toString(); } + public List> getPoolingConnectionInfo() { + List> list = new ArrayList>(); + lock.lock(); + try { + for (int i = 0; i < poolingCount; ++i) { + ConnectionHolder connHolder = connections[i]; + Connection conn = connHolder.getConnection(); + + Map map = new LinkedHashMap(); + map.put("id", System.identityHashCode(conn)); + map.put("useCount", connHolder.getUseCount()); + if (connHolder.getLastActiveTimeMillis() > 0) { + map.put("lastActiveTime", new Date(connHolder.getLastActiveTimeMillis())); + } + map.put("connectTime", new Date(connHolder.getTimeMillis())); + map.put("holdability", connHolder.getUnderlyingHoldability()); + map.put("transactionIsolation", connHolder.getUnderlyingTransactionIsolation()); + map.put("autoCommit", connHolder.isUnderlyingAutoCommit()); + map.put("readoOnly", connHolder.isUnderlyingReadOnly()); + + if (connHolder.isPoolPreparedStatements()) { + List> stmtCache = new ArrayList>(); + PreparedStatementPool stmtPool = connHolder.getStatementPool(); + for (PreparedStatementHolder stmtHolder : stmtPool.getMap().values()) { + Map stmtInfo = new LinkedHashMap(); + + stmtInfo.put("sql", stmtHolder.getKey().getSql()); + stmtInfo.put("defaultRowPretch", stmtHolder.getDefaultRowPretch()); + stmtInfo.put("rowPrefetch", stmtHolder.getRowPrefetch()); + stmtInfo.put("hitCount", stmtHolder.getHitCount()); + + stmtCache.add(stmtInfo); + } + + map.put("pscache", stmtCache); + } + + list.add(map); + } + } finally { + lock.unlock(); + } + return list; + } + public void logTransaction(TransactionInfo info) { long transactionMillis = info.getEndTimeMillis() - info.getStartTimeMillis(); if (transactionThresholdMillis > 0 && transactionMillis > transactionThresholdMillis) { diff --git a/src/test/java/com/alibaba/druid/DBCPTest.java b/src/test/java/com/alibaba/druid/DBCPTest.java new file mode 100644 index 0000000000..3f9c94a938 --- /dev/null +++ b/src/test/java/com/alibaba/druid/DBCPTest.java @@ -0,0 +1,58 @@ +package com.alibaba.druid; + +import java.sql.Connection; +import java.util.concurrent.CountDownLatch; + +import junit.framework.TestCase; + +import org.apache.commons.dbcp.BasicDataSource; + +import com.alibaba.druid.mock.MockDriver; +import com.alibaba.druid.pool.DruidDataSource; + +public class DBCPTest extends TestCase { + + public void test_max() throws Exception { + Class.forName("com.alibaba.druid.mock.MockDriver"); + + final BasicDataSource dataSource = new BasicDataSource(); +// final DruidDataSource dataSource = new DruidDataSource(); + dataSource.setInitialSize(3); + dataSource.setMaxActive(20); + dataSource.setMaxIdle(20); + dataSource.setDriverClassName("com.alibaba.druid.mock.MockDriver"); + dataSource.setUrl("jdbc:mock:xxx"); + + final int THREAD_COUNT = 200; + final CountDownLatch endLatch = new CountDownLatch(THREAD_COUNT); + final CountDownLatch startLatch = new CountDownLatch(1); + Thread[] threads = new Thread[THREAD_COUNT]; + for (int i = 0; i < THREAD_COUNT; ++i) { + threads[i] = new Thread() { + + public void run() { + try { + startLatch.await(); + for (int i = 0; i < 1000; ++i) { + Connection conn = dataSource.getConnection(); + Thread.sleep(1); + conn.close(); + } + } catch (Exception e) { + } finally { + endLatch.countDown(); + } + } + }; + threads[i].start(); + } + + startLatch.countDown(); + + endLatch.await(); + +// System.out.println(dataSource.getNumIdle()); + System.out.println(MockDriver.instance.getConnections().size()); + System.out.println(MockDriver.instance.getConnectionCloseCount()); + } +}