From 57769159521658f07ce24a986040e48a518ebaab Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 19 Sep 2011 06:07:27 +0000 Subject: [PATCH] =?UTF-8?q?=E9=95=BF=E4=BA=8B=E5=8A=A1=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/druid/trunk@856 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../druid/pool/DruidAbstractDataSource.java | 17 +++++++++++-- .../alibaba/druid/pool/DruidDataSource.java | 25 ++++++++++++++++--- .../druid/pool/PoolableConnection.java | 13 ++++++++-- .../basic/PoolableCallableStatementTest.java | 2 ++ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 1043cf555c..f8f04599c7 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -55,6 +55,7 @@ import com.alibaba.druid.util.ConcurrentIdentityHashMap; import com.alibaba.druid.util.DruidLoaderUtils; import com.alibaba.druid.util.Histogram; import com.alibaba.druid.util.JdbcUtils; +import com.alibaba.druid.util.TransactionInfo; /** * @author wenshao @@ -172,6 +173,8 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements protected boolean breakAfterAcquireFailure = false; + protected long transactionThresholdMillis = 0L; + protected final AtomicLong commitCount = new AtomicLong(); protected final AtomicLong startTransactionCount = new AtomicLong(); protected final AtomicLong rollbackCount = new AtomicLong(); @@ -186,7 +189,17 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements public Histogram getTransactionHistogram() { return transactionHistogram; } - + + public long getTransactionThresholdMillis() { + return transactionThresholdMillis; + } + + public void setTransactionThresholdMillis(long transactionThresholdMillis) { + this.transactionThresholdMillis = transactionThresholdMillis; + } + + public abstract void logTransaction(TransactionInfo info); + public long[] getTransactionHistogramValues() { return transactionHistogram.toArray(); } @@ -1358,5 +1371,5 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements public abstract int getRawDriverMinorVersion(); public abstract String getProperties(); - + } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index f32ca0a623..656fbbb0cc 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -17,6 +17,7 @@ package com.alibaba.druid.pool; import java.sql.Connection; import java.sql.SQLException; +import java.sql.SQLTimeoutException; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -52,6 +53,7 @@ import com.alibaba.druid.proxy.DruidDriver; import com.alibaba.druid.proxy.jdbc.DataSourceProxyConfig; import com.alibaba.druid.stat.DruidDataSourceStatManager; import com.alibaba.druid.util.JdbcUtils; +import com.alibaba.druid.util.TransactionInfo; /** * @author ljw @@ -127,7 +129,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } finally { lock.unlock(); } - + commitCount.set(0); rollbackCount.set(0); startTransactionCount.set(0); @@ -149,7 +151,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat lock.unlock(); } } - + public boolean isInited() { return this.inited; } @@ -239,7 +241,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } else if (realDriverClassName.equals("com.sybase.jdbc2.jdbc.SybDriver")) { this.exceptionSorter = new SybaseExceptionSorter(); - + } else if (realDriverClassName.equals("com.alibaba.druid.mock.MockDriver")) { this.exceptionSorter = new MockExceptionSorter(); } @@ -1036,7 +1038,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat public int getLockQueueLength() { return lock.getQueueLength(); } - + public String dump() { lock.lock(); try { @@ -1091,6 +1093,21 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat return buf.toString(); } + public void logTransaction(TransactionInfo info) { + long transactionMillis = info.getEndTimeMillis() - info.getStartTimeMillis(); + if (transactionThresholdMillis > 0 && transactionMillis > transactionThresholdMillis) { + StringBuilder buf = new StringBuilder(); + buf.append("long time transaction, take "); + buf.append(transactionMillis); + buf.append(" ms : "); + for (String sql : info.getSqlList()) { + buf.append(sql); + buf.append(";"); + } + LOG.error(buf.toString(), new SQLTimeoutException()); + } + } + @Override public String getVersion() { return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion + "-2011-09-11 17:31"; diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index 1690dafe80..2dd237b899 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -627,9 +627,18 @@ public class PoolableConnection implements PooledConnection, Connection { private void handleEndTransaction() { if (transactionInfo != null) { DruidAbstractDataSource dataSource = holder.getDataSource(); - - long transactionMillis = System.currentTimeMillis() - transactionInfo.getStartTimeMillis(); + + long currentTimeMillis = System.currentTimeMillis(); + transactionInfo.setEndTimeMillis(currentTimeMillis); + + long transactionMillis = currentTimeMillis - transactionInfo.getStartTimeMillis(); dataSource.getTransactionHistogram().recode(transactionMillis); + + final long transactionThresholdMillis = dataSource.getTransactionThresholdMillis(); + if (transactionThresholdMillis > 0 && transactionMillis > transactionThresholdMillis) { + + } + transactionInfo = null; } } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/basic/PoolableCallableStatementTest.java b/src/test/java/com/alibaba/druid/bvt/pool/basic/PoolableCallableStatementTest.java index 95b285deb4..26d476be23 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/basic/PoolableCallableStatementTest.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/basic/PoolableCallableStatementTest.java @@ -49,6 +49,7 @@ public class PoolableCallableStatementTest extends TestCase { Assert.assertEquals(raw, stmt.getCallableStatementRaw()); } + @SuppressWarnings("deprecation") public void test_callableStmt() throws Exception { Assert.assertTrue(stmt.wasNull() == false); @@ -263,6 +264,7 @@ public class PoolableCallableStatementTest extends TestCase { } } + @SuppressWarnings("deprecation") public void test_get_error() { { SQLException error = null;