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());