From dfdf2d747def399cd2c6f58d41509e7b042e9906 Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 19 Sep 2011 04:45:31 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BA=8B=E5=8A=A1=E6=97=B6=E9=97=B4=E7=9B=B4?= =?UTF-8?q?=E6=96=B9=E5=9B=BE?= 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@854 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../druid/pool/PoolableConnection.java | 40 +++++++++++-------- .../druid/bvt/pool/basic/ConnectionTest3.java | 2 +- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index 0c9a8bc934..f3974a6278 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -43,17 +43,18 @@ import com.alibaba.druid.logging.Log; import com.alibaba.druid.logging.LogFactory; import com.alibaba.druid.pool.PoolablePreparedStatement.PreparedStatementKey; import com.alibaba.druid.pool.PreparedStatementPool.MethodType; +import com.alibaba.druid.util.TransactionInfo; /** * @author wenshao */ public class PoolableConnection implements PooledConnection, Connection { - private final static Log LOG = LogFactory.getLog(PoolableConnection.class); + private final static Log LOG = LogFactory.getLog(PoolableConnection.class); protected Connection conn; protected ConnectionHolder holder; - protected long startTransactionTimeMillis = 0; + protected TransactionInfo transactionInfo; public PoolableConnection(ConnectionHolder holder){ this.conn = holder.getConnection(); @@ -140,7 +141,7 @@ public class PoolableConnection implements PooledConnection, Connection { this.holder = null; conn = null; - startTransactionTimeMillis = 0; + transactionInfo = null; } // //////////////////// @@ -546,8 +547,9 @@ public class PoolableConnection implements PooledConnection, Connection { try { if ((!autoCommit) && conn.getAutoCommit()) { - holder.getDataSource().incrementStartTransactionCount(); - startTransactionTimeMillis = System.currentTimeMillis(); + DruidAbstractDataSource dataSource = holder.getDataSource(); + dataSource.incrementStartTransactionCount(); + transactionInfo = new TransactionInfo(dataSource.createTransactionId()); } conn.setAutoCommit(autoCommit); @@ -575,14 +577,12 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } finally { - long transactionMillis = System.currentTimeMillis() - startTransactionTimeMillis; - dataSource.getTransactionHistogram().recode(transactionMillis); - startTransactionTimeMillis = 0; + handleEndTransaction(); } } - public long getStartTransactionTimeMillis() { - return startTransactionTimeMillis; + public TransactionInfo getTransactionInfo() { + return transactionInfo; } @Override @@ -597,9 +597,7 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } finally { - long transactionMillis = System.currentTimeMillis() - startTransactionTimeMillis; - dataSource.getTransactionHistogram().recode(transactionMillis); - startTransactionTimeMillis = 0; + handleEndTransaction(); } } @@ -613,18 +611,26 @@ public class PoolableConnection implements PooledConnection, Connection { @Override public void rollback(Savepoint savepoint) throws SQLException { checkOpen(); - + DruidAbstractDataSource dataSource = holder.getDataSource(); dataSource.incrementRollbackCount(); - + try { conn.rollback(savepoint); } catch (SQLException ex) { handleException(ex); } finally { - long transactionMillis = System.currentTimeMillis() - startTransactionTimeMillis; + handleEndTransaction(); + } + } + + private void handleEndTransaction() { + if (transactionInfo != null) { + DruidAbstractDataSource dataSource = holder.getDataSource(); + + long transactionMillis = System.currentTimeMillis() - transactionInfo.getStartTimeMillis(); dataSource.getTransactionHistogram().recode(transactionMillis); - startTransactionTimeMillis = 0; + transactionInfo = null; } } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/basic/ConnectionTest3.java b/src/test/java/com/alibaba/druid/bvt/pool/basic/ConnectionTest3.java index 783ddad70d..ca032997a4 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/basic/ConnectionTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/basic/ConnectionTest3.java @@ -53,7 +53,7 @@ public class ConnectionTest3 extends TestCase { public void test_basic() throws Exception { PoolableConnection conn = (PoolableConnection) dataSource.getConnection(); - conn.getStartTransactionTimeMillis(); + conn.getTransactionInfo(); conn.getMetaData(); conn.setReadOnly(true); Assert.assertEquals(true, conn.isReadOnly());