From 08a4e280ac8618ef2b2e5c392e73dcec71c55345 Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 19 Sep 2011 06:37:49 +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@859 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../druid/TransactionTimeoutException.java | 10 ++++ .../alibaba/druid/pool/DruidDataSource.java | 6 +- .../druid/bvt/bug/Bug_for_happyday517.java | 29 +++++---- .../bvt/pool/TestLogLongTimeTransaction.java | 60 +++++++++++++++++++ 4 files changed, 89 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/TransactionTimeoutException.java create mode 100644 src/test/java/com/alibaba/druid/bvt/pool/TestLogLongTimeTransaction.java diff --git a/src/main/java/com/alibaba/druid/TransactionTimeoutException.java b/src/main/java/com/alibaba/druid/TransactionTimeoutException.java new file mode 100644 index 0000000000..97c4acdd37 --- /dev/null +++ b/src/main/java/com/alibaba/druid/TransactionTimeoutException.java @@ -0,0 +1,10 @@ +package com.alibaba.druid; + +import java.sql.SQLTimeoutException; + + +public class TransactionTimeoutException extends SQLTimeoutException { + + private static final long serialVersionUID = 1L; + +} diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 656fbbb0cc..4378290d40 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -17,7 +17,6 @@ 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; @@ -37,6 +36,7 @@ import javax.naming.StringRefAddr; import javax.sql.ConnectionEvent; import javax.sql.ConnectionEventListener; +import com.alibaba.druid.TransactionTimeoutException; import com.alibaba.druid.VERSION; import com.alibaba.druid.filter.Filter; import com.alibaba.druid.logging.Log; @@ -483,7 +483,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat // 第二步,检查是否需要回滚 if ((!isAutoCommit) && (!isReadOnly)) { - conn.rollback(); + pooledConnection.rollback(); } // 第三步,清楚警告信息,重设autoCommit为true @@ -1104,7 +1104,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat buf.append(sql); buf.append(";"); } - LOG.error(buf.toString(), new SQLTimeoutException()); + LOG.error(buf.toString(), new TransactionTimeoutException()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_happyday517.java b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_happyday517.java index 9d0b59caf1..99a27fa801 100644 --- a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_happyday517.java +++ b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_happyday517.java @@ -7,6 +7,7 @@ import java.sql.Statement; import junit.framework.Assert; import junit.framework.TestCase; +import com.alibaba.druid.mock.MockDriver; import com.alibaba.druid.mock.MockStatement; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.stat.DruidDataSourceStatManager; @@ -14,8 +15,10 @@ import com.alibaba.druid.stat.DruidDataSourceStatManager; public class Bug_for_happyday517 extends TestCase { private DruidDataSource dataSource; + private MockDriver driver; protected void setUp() throws Exception { + driver = new MockDriver(); dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mock:xxx"); dataSource.setFilters("stat,trace,log4j,encoding"); @@ -92,38 +95,38 @@ public class Bug_for_happyday517 extends TestCase { conn.close(); } - + public void test_for_happyday517_4() throws Exception { Connection conn = dataSource.getConnection(); - + String sql = "select 1"; Statement stmt = conn.prepareCall(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); - + MockStatement mockStmt = stmt.unwrap(MockStatement.class); - + Assert.assertEquals(ResultSet.TYPE_SCROLL_SENSITIVE, mockStmt.getResultSetType()); Assert.assertEquals(ResultSet.CONCUR_UPDATABLE, mockStmt.getResultSetConcurrency()); - + stmt.close(); - + conn.close(); } - + public void test_for_happyday517_5() throws Exception { Connection conn = dataSource.getConnection(); - + String sql = "select 1"; Statement stmt = conn.prepareCall(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE, - ResultSet.CLOSE_CURSORS_AT_COMMIT); - + ResultSet.CLOSE_CURSORS_AT_COMMIT); + MockStatement mockStmt = stmt.unwrap(MockStatement.class); - + Assert.assertEquals(ResultSet.TYPE_SCROLL_SENSITIVE, mockStmt.getResultSetType()); Assert.assertEquals(ResultSet.CONCUR_UPDATABLE, mockStmt.getResultSetConcurrency()); Assert.assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, mockStmt.getResultSetHoldability()); - + stmt.close(); - + conn.close(); } } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestLogLongTimeTransaction.java b/src/test/java/com/alibaba/druid/bvt/pool/TestLogLongTimeTransaction.java new file mode 100644 index 0000000000..3bcfb57910 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestLogLongTimeTransaction.java @@ -0,0 +1,60 @@ +package com.alibaba.druid.bvt.pool; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.mock.MockDriver; +import com.alibaba.druid.mock.MockStatement; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.stat.DruidDataSourceStatManager; + +public class TestLogLongTimeTransaction extends TestCase { + + private DruidDataSource dataSource; + private MockDriver driver; + + protected void setUp() throws Exception { + driver = new MockDriver() { + + protected ResultSet executeQuery(MockStatement stmt, String sql) throws SQLException { + try { + Thread.sleep(2); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return super.executeQuery(stmt, sql); + } + }; + + dataSource = new DruidDataSource(); + dataSource.setDriver(driver); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setFilters("stat,trace,log4j,encoding"); + dataSource.setTransactionThresholdMillis(1); + + } + + protected void tearDown() throws Exception { + dataSource.close(); + Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size()); + } + + public void test_0() throws Exception { + Connection conn = dataSource.getConnection(); + + conn.setAutoCommit(false); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT 1"); + rs.next(); + rs.close(); + stmt.close(); + conn.commit(); + conn.close(); + } +}