From 3d5ea4cb3c346fe1afdcace904a46a877ed90558 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 20 Sep 2012 08:59:20 +0800 Subject: [PATCH 1/2] support lock unfair --- .../druid/pool/DruidAbstractDataSource.java | 14 +++--- .../alibaba/druid/pool/DruidDataSource.java | 7 ++- .../alibaba/druid/benckmark/pool/Case1.java | 43 ++++++++++++++++--- 3 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 799b3b20ec..a570ecea29 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -215,11 +215,15 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements protected boolean useOracleImplicitCache = true; - protected final ReentrantLock lock = new ReentrantLock(true); + protected final ReentrantLock lock; protected AtomicLong createCount = new AtomicLong(); protected AtomicLong destroyCount = new AtomicLong(); + public DruidAbstractDataSource(boolean lockFair){ + lock = new ReentrantLock(lockFair); + } + public boolean isOracle() { return isOracle; } @@ -563,7 +567,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } public void setRemoveAbandonedTimeout(int removeAbandonedTimeout) { - this.removeAbandonedTimeoutMillis = (long)removeAbandonedTimeout * 1000; + this.removeAbandonedTimeoutMillis = (long) removeAbandonedTimeout * 1000; } public void setRemoveAbandonedTimeoutMillis(long removeAbandonedTimeoutMillis) { @@ -923,9 +927,9 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements this.jdbcUrl = jdbcUrl; -// if (jdbcUrl.startsWith(ConfigFilter.URL_PREFIX)) { -// this.filters.add(new ConfigFilter()); -// } + // if (jdbcUrl.startsWith(ConfigFilter.URL_PREFIX)) { + // this.filters.add(new ConfigFilter()); + // } } public String getDriverClassName() { diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 1e920a115a..8de4dcb948 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -125,6 +125,11 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat private JdbcDataSourceStat dataSourceStat; public DruidDataSource(){ + this(true); + } + + public DruidDataSource(boolean fairLock){ + super (fairLock); } public String getInitStackTrace() { @@ -923,7 +928,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } } - void putLast(DruidConnectionHolder e, long lastActiveTimeMillis) throws SQLException { + void putLast(DruidConnectionHolder e, long lastActiveTimeMillis) { e.setLastActiveTimeMillis(lastActiveTimeMillis); connections[poolingCount++] = e; diff --git a/src/test/java/com/alibaba/druid/benckmark/pool/Case1.java b/src/test/java/com/alibaba/druid/benckmark/pool/Case1.java index d8f5de9a2c..47ae7a444a 100644 --- a/src/test/java/com/alibaba/druid/benckmark/pool/Case1.java +++ b/src/test/java/com/alibaba/druid/benckmark/pool/Case1.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.benckmark.pool; +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadInfo; import java.sql.Connection; import java.text.NumberFormat; import java.util.concurrent.CountDownLatch; @@ -45,8 +47,8 @@ public class Case1 extends TestCase { private int maxPoolSize = 50; private int maxActive = 50; private String validationQuery = "SELECT 1"; - private int threadCount = 10; - private int loopCount = 4; + private int threadCount = 5; + private int loopCount = 3; final int LOOP_COUNT = 1000 * 100; protected void setUp() throws Exception { @@ -56,8 +58,8 @@ public class Case1 extends TestCase { driverClass = "com.alibaba.druid.mock.MockDriver"; } - public void f_test_0() throws Exception { - DruidDataSource dataSource = new DruidDataSource(); + public void test_0() throws Exception { + DruidDataSource dataSource = new DruidDataSource(false); dataSource.setInitialSize(initialSize); dataSource.setMaxActive(maxActive); @@ -78,7 +80,7 @@ public class Case1 extends TestCase { System.out.println(); } - public void f_test_1() throws Exception { + public void test_1() throws Exception { final BasicDataSource dataSource = new BasicDataSource(); dataSource.setInitialSize(initialSize); @@ -130,6 +132,9 @@ public class Case1 extends TestCase { final CountDownLatch startLatch = new CountDownLatch(1); final CountDownLatch endLatch = new CountDownLatch(threadCount); + final CountDownLatch dumpLatch = new CountDownLatch(1); + + Thread[] threads = new Thread[threadCount]; for (int i = 0; i < threadCount; ++i) { Thread thread = new Thread() { @@ -145,8 +150,15 @@ public class Case1 extends TestCase { ex.printStackTrace(); } endLatch.countDown(); + + try { + dumpLatch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } } }; + threads[i] = thread; thread.start(); } long startMillis = System.currentTimeMillis(); @@ -155,11 +167,30 @@ public class Case1 extends TestCase { startLatch.countDown(); endLatch.await(); + long[] threadIdArray = new long[threads.length]; + for (int i = 0; i < threads.length; ++i) { + threadIdArray[i] = threads[i].getId(); + } + ThreadInfo[] threadInfoArray = ManagementFactory.getThreadMXBean().getThreadInfo(threadIdArray); + + dumpLatch.countDown(); + + long blockedCount = 0; + long waitedCount = 0; + for (int i = 0; i < threadInfoArray.length; ++i) { + ThreadInfo threadInfo = threadInfoArray[i]; + blockedCount += threadInfo.getBlockedCount(); + waitedCount += threadInfo.getWaitedCount(); + } + long millis = System.currentTimeMillis() - startMillis; long ygc = TestUtil.getYoungGC() - startYGC; long fullGC = TestUtil.getFullGC() - startFullGC; System.out.println("thread " + threadCount + " " + name + " millis : " - + NumberFormat.getInstance().format(millis) + ", YGC " + ygc + " FGC " + fullGC); + + NumberFormat.getInstance().format(millis) + "; YGC " + ygc + " FGC " + fullGC + + " blocked " + NumberFormat.getInstance().format(blockedCount) // + + " waited " + NumberFormat.getInstance().format(waitedCount)); + } } From 78751d169d29609bf52a2382ec9487c7892266b2 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 21 Sep 2012 14:38:05 +0800 Subject: [PATCH 2/2] StatFilter add getter & setter for logSlowSql, slowSqlMillis --- .../com/alibaba/druid/filter/stat/StatFilter.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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 7af7ba5012..29d7c87c76 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java @@ -102,6 +102,18 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { return slowSqlMillis; } + public void setSlowSqlMillis(long slowSqlMillis) { + this.slowSqlMillis = slowSqlMillis; + } + + public boolean isLogSlowSql() { + return logSlowSql; + } + + public void setLogSlowSql(boolean logSlowSql) { + this.logSlowSql = logSlowSql; + } + public boolean isConnectionStackTraceEnable() { return connectionStackTraceEnable; }