diff --git a/src/main/java/com/alibaba/druid/mock/MockConnection.java b/src/main/java/com/alibaba/druid/mock/MockConnection.java index cfc6e268e3..d47d985d9b 100644 --- a/src/main/java/com/alibaba/druid/mock/MockConnection.java +++ b/src/main/java/com/alibaba/druid/mock/MockConnection.java @@ -469,6 +469,12 @@ public class MockConnection extends ConnectionBase implements Connection { public int getNetworkTimeout() throws SQLException { throw new SQLFeatureNotSupportedException(); } + + @Override + public void setReadOnly(boolean readOnly) throws SQLException { + checkState(); + super.setReadOnly(readOnly); + } public void handleSleep() { if (getConnectProperties() != null) { diff --git a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java index 95e8b65fae..c6830d4979 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java +++ b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java @@ -48,7 +48,7 @@ public final class DruidConnectionHolder { private PreparedStatementPool statementPool; - private final List statementTrace = new ArrayList(); + private final List statementTrace = new ArrayList(2); private final boolean defaultReadOnly; private final int defaultHoldability; diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java index 54225a424d..013b732d07 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java @@ -191,7 +191,7 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. if (this.holder != null) { this.holder.clearStatementCache(); } - + this.traceEnable = false; this.holder = null; this.transactionInfo = null; @@ -677,9 +677,9 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. @Override public void setAutoCommit(boolean autoCommit) throws SQLException { checkState(); - + boolean useLocalSessionState = holder.getDataSource().isUseLocalSessionState(); - + if (useLocalSessionState) { if (autoCommit == holder.isUnderlyingAutoCommit()) { return; @@ -762,7 +762,12 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. public Savepoint setSavepoint(String name) throws SQLException { checkState(); - return conn.setSavepoint(name); + try { + return conn.setSavepoint(name); + } catch (SQLException ex) { + handleException(ex); + return null; // never arrive + } } @Override @@ -810,7 +815,12 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. public Clob createClob() throws SQLException { checkState(); - return conn.createClob(); + try { + return conn.createClob(); + } catch (SQLException ex) { + handleException(ex); + return null; // never arrive + } } @Override @@ -836,7 +846,7 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. @Override public void setReadOnly(boolean readOnly) throws SQLException { checkState(); - + boolean useLocalSessionState = holder.getDataSource().isUseLocalSessionState(); if (useLocalSessionState) { if (readOnly == holder.isUnderlyingReadOnly()) { @@ -844,7 +854,12 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. } } - conn.setReadOnly(readOnly); + try { + conn.setReadOnly(readOnly); + } catch (SQLException ex) { + handleException(ex); + } + holder.setUnderlyingReadOnly(readOnly); } @@ -859,7 +874,11 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. public void setCatalog(String catalog) throws SQLException { checkState(); - conn.setCatalog(catalog); + try { + conn.setCatalog(catalog); + } catch (SQLException ex) { + handleException(ex); + } } @Override @@ -872,7 +891,7 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. @Override public void setTransactionIsolation(int level) throws SQLException { checkState(); - + boolean useLocalSessionState = holder.getDataSource().isUseLocalSessionState(); if (useLocalSessionState) { if (level == holder.getUnderlyingTransactionIsolation()) { @@ -880,7 +899,11 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. } } - conn.setTransactionIsolation(level); + try { + conn.setTransactionIsolation(level); + } catch (SQLException ex) { + handleException(ex); + } holder.setUnderlyingTransactionIsolation(level); } @@ -888,7 +911,7 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. public int getTransactionIsolation() throws SQLException { checkState(); - return conn.getTransactionIsolation(); + return holder.getUnderlyingTransactionIsolation(); } @Override @@ -901,8 +924,11 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. @Override public void clearWarnings() throws SQLException { checkState(); - - conn.clearWarnings(); + try { + conn.clearWarnings(); + } catch (SQLException ex) { + handleException(ex); + } } @Override @@ -922,7 +948,7 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. @Override public void setHoldability(int holdability) throws SQLException { checkState(); - + boolean useLocalSessionState = holder.getDataSource().isUseLocalSessionState(); if (useLocalSessionState) { if (holdability == holder.getUnderlyingHoldability()) { @@ -945,7 +971,12 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. public Savepoint setSavepoint() throws SQLException { checkState(); - return conn.setSavepoint(); + try { + return conn.setSavepoint(); + } catch (SQLException ex) { + handleException(ex); + return null; + } } @Override @@ -1057,7 +1088,7 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. holder.getStatementEventListeners().remove(listener); } - + public Throwable getDisableError() { return disableError; } diff --git a/src/main/java/com/alibaba/druid/util/jdbc/ConnectionBase.java b/src/main/java/com/alibaba/druid/util/jdbc/ConnectionBase.java index 3725e55873..8c63fc51fb 100644 --- a/src/main/java/com/alibaba/druid/util/jdbc/ConnectionBase.java +++ b/src/main/java/com/alibaba/druid/util/jdbc/ConnectionBase.java @@ -60,6 +60,7 @@ public abstract class ConnectionBase implements Connection { @Override public void setCatalog(String catalog) throws SQLException { + checkState(); this.catalog = catalog; } @@ -67,9 +68,14 @@ public abstract class ConnectionBase implements Connection { public String getCatalog() throws SQLException { return catalog; } + + public void checkState() throws SQLException { + + } @Override public void setTransactionIsolation(int level) throws SQLException { + checkState(); this.transactionIsolation = level; } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn.java b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn.java index 57f7c84584..c575abb113 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn.java @@ -1,5 +1,6 @@ package com.alibaba.druid.bvt.pool.exception; +import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -59,6 +60,11 @@ public class OracleExceptionSorterTest_closeConn extends TestCase { mockConn.setError(exception); conn.close(); + + { + Connection conn2 = dataSource.getConnection(); + conn2.close(); + } Assert.assertEquals(0, dataSource.getActiveCount()); Assert.assertEquals(1, dataSource.getPoolingCount()); Assert.assertEquals(2, dataSource.getCreateCount()); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_1.java b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_1.java index 4b5fc9e9a0..ed1925867d 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_1.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_1.java @@ -1,5 +1,6 @@ package com.alibaba.druid.bvt.pool.exception; +import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -58,6 +59,11 @@ public class OracleExceptionSorterTest_closeConn_1 extends TestCase { mockConn.setError(exception); conn.close(); + + { + Connection conn2 = dataSource.getConnection(); + conn2.close(); + } Assert.assertEquals(0, dataSource.getActiveCount()); Assert.assertEquals(1, dataSource.getPoolingCount()); Assert.assertEquals(2, dataSource.getCreateCount()); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_2.java b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_2.java index e130b09da1..7badd0845d 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_2.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_2.java @@ -1,5 +1,6 @@ package com.alibaba.druid.bvt.pool.exception; +import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -58,6 +59,11 @@ public class OracleExceptionSorterTest_closeConn_2 extends TestCase { mockConn.setError(exception); conn.close(); + + { + Connection conn2 = dataSource.getConnection(); + conn2.close(); + } Assert.assertEquals(0, dataSource.getActiveCount()); Assert.assertEquals(1, dataSource.getPoolingCount()); Assert.assertEquals(2, dataSource.getCreateCount()); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_3.java b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_3.java index 6502b9e672..77bab61db1 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_3.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_closeConn_3.java @@ -1,5 +1,6 @@ package com.alibaba.druid.bvt.pool.exception; +import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -59,6 +60,11 @@ public class OracleExceptionSorterTest_closeConn_3 extends TestCase { mockConn.setError(exception); conn.close(); + + { + Connection conn2 = dataSource.getConnection(); + conn2.close(); + } Assert.assertEquals(0, dataSource.getActiveCount()); Assert.assertEquals(1, dataSource.getPoolingCount()); Assert.assertEquals(2, dataSource.getCreateCount()); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_commit.java b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_commit.java new file mode 100644 index 0000000000..44bf21810e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_commit.java @@ -0,0 +1,82 @@ +package com.alibaba.druid.bvt.pool.exception; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.mock.MockConnection; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.druid.pool.vendor.OracleExceptionSorter; +import com.alibaba.druid.test.util.OracleMockDriver; +import com.alibaba.druid.util.JdbcUtils; + +public class OracleExceptionSorterTest_commit extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + + dataSource.setExceptionSorter(new OracleExceptionSorter()); + + dataSource.setDriver(new OracleMockDriver()); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxOpenPreparedStatements(100); + } + + protected void tearDowN() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_connect() throws Exception { + String sql = "SELECT 1"; + { + DruidPooledConnection conn = dataSource.getConnection(); + + PreparedStatement pstmt = conn.prepareStatement(sql); + pstmt.execute(); + pstmt.close(); + conn.close(); + + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(1, dataSource.getCreateCount()); + } + + DruidPooledConnection conn = dataSource.getConnection(); + MockConnection mockConn = conn.unwrap(MockConnection.class); + Assert.assertNotNull(mockConn); + + conn.setAutoCommit(false); + + conn.prepareStatement(sql); + + SQLException exception = new SQLException("xx", "xxx", 28); + mockConn.setError(exception); + + Exception commitError = null; + try { + conn.commit(); + } catch (Exception ex) { + commitError = ex; + } + Assert.assertNotNull(commitError); + + conn.close(); + + { + Connection conn2 = dataSource.getConnection(); + conn2.close(); + } + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(2, dataSource.getCreateCount()); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_rollback.java b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_rollback.java new file mode 100644 index 0000000000..b4ec440cb0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_rollback.java @@ -0,0 +1,83 @@ +package com.alibaba.druid.bvt.pool.exception; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.mock.MockConnection; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.druid.pool.vendor.OracleExceptionSorter; +import com.alibaba.druid.test.util.OracleMockDriver; +import com.alibaba.druid.util.JdbcUtils; + +public class OracleExceptionSorterTest_rollback extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + + dataSource.setExceptionSorter(new OracleExceptionSorter()); + + dataSource.setDriver(new OracleMockDriver()); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxOpenPreparedStatements(100); + } + + protected void tearDowN() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_connect() throws Exception { + String sql = "SELECT 1"; + { + DruidPooledConnection conn = dataSource.getConnection(); + + PreparedStatement pstmt = conn.prepareStatement(sql); + pstmt.execute(); + pstmt.close(); + conn.close(); + + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(1, dataSource.getCreateCount()); + } + + DruidPooledConnection conn = dataSource.getConnection(); + MockConnection mockConn = conn.unwrap(MockConnection.class); + Assert.assertNotNull(mockConn); + + conn.setAutoCommit(false); + + PreparedStatement stmt = conn.prepareStatement(sql); + stmt.execute(); + + SQLException exception = new SQLException("xx", "xxx", 28); + mockConn.setError(exception); + + Exception rollbackError = null; + try { + conn.rollback(); + } catch (Exception ex) { + rollbackError = ex; + } + Assert.assertNotNull(rollbackError); + + conn.close(); + + { + Connection conn2 = dataSource.getConnection(); + conn2.close(); + } + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(2, dataSource.getCreateCount()); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setCatalog.java b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setCatalog.java new file mode 100644 index 0000000000..e8953cc78c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setCatalog.java @@ -0,0 +1,79 @@ +package com.alibaba.druid.bvt.pool.exception; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.mock.MockConnection; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.druid.pool.vendor.OracleExceptionSorter; +import com.alibaba.druid.test.util.OracleMockDriver; +import com.alibaba.druid.util.JdbcUtils; + +public class OracleExceptionSorterTest_setCatalog extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + + dataSource.setExceptionSorter(new OracleExceptionSorter()); + + dataSource.setDriver(new OracleMockDriver()); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxOpenPreparedStatements(100); + } + + protected void tearDowN() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_connect() throws Exception { + String sql = "SELECT 1"; + { + DruidPooledConnection conn = dataSource.getConnection(); + + PreparedStatement pstmt = conn.prepareStatement(sql); + pstmt.execute(); + pstmt.close(); + conn.close(); + + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(1, dataSource.getCreateCount()); + } + + DruidPooledConnection conn = dataSource.getConnection(); + MockConnection mockConn = conn.unwrap(MockConnection.class); + Assert.assertNotNull(mockConn); + + SQLException exception = new SQLException("xx", "xxx", 28); + mockConn.setError(exception); + + Exception setError = null; + try { + conn.setCatalog("xxx"); + } catch (Exception ex) { + setError = ex; + } + Assert.assertNotNull(setError); + + conn.close(); + + { + Connection conn2 = dataSource.getConnection(); + conn2.close(); + } + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(2, dataSource.getCreateCount()); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setIsolationLevel.java b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setIsolationLevel.java new file mode 100644 index 0000000000..2eacb95639 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setIsolationLevel.java @@ -0,0 +1,78 @@ +package com.alibaba.druid.bvt.pool.exception; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.mock.MockConnection; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.druid.pool.vendor.OracleExceptionSorter; +import com.alibaba.druid.test.util.OracleMockDriver; +import com.alibaba.druid.util.JdbcUtils; + +public class OracleExceptionSorterTest_setIsolationLevel extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + + dataSource.setExceptionSorter(new OracleExceptionSorter()); + + dataSource.setDriver(new OracleMockDriver()); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxOpenPreparedStatements(100); + } + + protected void tearDowN() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_connect() throws Exception { + String sql = "SELECT 1"; + { + DruidPooledConnection conn = dataSource.getConnection(); + + PreparedStatement pstmt = conn.prepareStatement(sql); + pstmt.execute(); + pstmt.close(); + conn.close(); + + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(1, dataSource.getCreateCount()); + } + + DruidPooledConnection conn = dataSource.getConnection(); + MockConnection mockConn = conn.unwrap(MockConnection.class); + Assert.assertNotNull(mockConn); + + SQLException exception = new SQLException("xx", "xxx", 28); + mockConn.setError(exception); + + Exception setError = null; + try { + conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); + } catch (Exception ex) { + setError = ex; + } + Assert.assertNotNull(setError); + + conn.close(); + + { + Connection conn2 = dataSource.getConnection(); + conn2.close(); + } + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(2, dataSource.getCreateCount()); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setReadOnly.java b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setReadOnly.java new file mode 100644 index 0000000000..c82ead38f8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setReadOnly.java @@ -0,0 +1,79 @@ +package com.alibaba.druid.bvt.pool.exception; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.mock.MockConnection; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.druid.pool.vendor.OracleExceptionSorter; +import com.alibaba.druid.test.util.OracleMockDriver; +import com.alibaba.druid.util.JdbcUtils; + +public class OracleExceptionSorterTest_setReadOnly extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + + dataSource.setExceptionSorter(new OracleExceptionSorter()); + + dataSource.setDriver(new OracleMockDriver()); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxOpenPreparedStatements(100); + } + + protected void tearDowN() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_connect() throws Exception { + String sql = "SELECT 1"; + { + DruidPooledConnection conn = dataSource.getConnection(); + + PreparedStatement pstmt = conn.prepareStatement(sql); + pstmt.execute(); + pstmt.close(); + conn.close(); + + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(1, dataSource.getCreateCount()); + } + + DruidPooledConnection conn = dataSource.getConnection(); + MockConnection mockConn = conn.unwrap(MockConnection.class); + Assert.assertNotNull(mockConn); + + SQLException exception = new SQLException("xx", "xxx", 28); + mockConn.setError(exception); + + Exception setError = null; + try { + conn.setReadOnly(true); + } catch (Exception ex) { + setError = ex; + } + Assert.assertNotNull(setError); + + conn.close(); + + { + Connection conn2 = dataSource.getConnection(); + conn2.close(); + } + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(2, dataSource.getCreateCount()); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setSavepoint.java b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setSavepoint.java new file mode 100644 index 0000000000..2b37cca419 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setSavepoint.java @@ -0,0 +1,79 @@ +package com.alibaba.druid.bvt.pool.exception; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.mock.MockConnection; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.druid.pool.vendor.OracleExceptionSorter; +import com.alibaba.druid.test.util.OracleMockDriver; +import com.alibaba.druid.util.JdbcUtils; + +public class OracleExceptionSorterTest_setSavepoint extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + + dataSource.setExceptionSorter(new OracleExceptionSorter()); + + dataSource.setDriver(new OracleMockDriver()); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxOpenPreparedStatements(100); + } + + protected void tearDowN() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_connect() throws Exception { + String sql = "SELECT 1"; + { + DruidPooledConnection conn = dataSource.getConnection(); + + PreparedStatement pstmt = conn.prepareStatement(sql); + pstmt.execute(); + pstmt.close(); + conn.close(); + + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(1, dataSource.getCreateCount()); + } + + DruidPooledConnection conn = dataSource.getConnection(); + MockConnection mockConn = conn.unwrap(MockConnection.class); + Assert.assertNotNull(mockConn); + + SQLException exception = new SQLException("xx", "xxx", 28); + mockConn.setError(exception); + + Exception setError = null; + try { + conn.setSavepoint(); + } catch (Exception ex) { + setError = ex; + } + Assert.assertNotNull(setError); + + conn.close(); + + { + Connection conn2 = dataSource.getConnection(); + conn2.close(); + } + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(2, dataSource.getCreateCount()); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setSavepointWithName.java b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setSavepointWithName.java new file mode 100644 index 0000000000..6238e5b782 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/exception/OracleExceptionSorterTest_setSavepointWithName.java @@ -0,0 +1,79 @@ +package com.alibaba.druid.bvt.pool.exception; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.mock.MockConnection; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.druid.pool.vendor.OracleExceptionSorter; +import com.alibaba.druid.test.util.OracleMockDriver; +import com.alibaba.druid.util.JdbcUtils; + +public class OracleExceptionSorterTest_setSavepointWithName extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + + dataSource.setExceptionSorter(new OracleExceptionSorter()); + + dataSource.setDriver(new OracleMockDriver()); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxOpenPreparedStatements(100); + } + + protected void tearDowN() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_connect() throws Exception { + String sql = "SELECT 1"; + { + DruidPooledConnection conn = dataSource.getConnection(); + + PreparedStatement pstmt = conn.prepareStatement(sql); + pstmt.execute(); + pstmt.close(); + conn.close(); + + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(1, dataSource.getCreateCount()); + } + + DruidPooledConnection conn = dataSource.getConnection(); + MockConnection mockConn = conn.unwrap(MockConnection.class); + Assert.assertNotNull(mockConn); + + SQLException exception = new SQLException("xx", "xxx", 28); + mockConn.setError(exception); + + Exception setError = null; + try { + conn.setSavepoint("xxx"); + } catch (Exception ex) { + setError = ex; + } + Assert.assertNotNull(setError); + + conn.close(); + + { + Connection conn2 = dataSource.getConnection(); + conn2.close(); + } + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(2, dataSource.getCreateCount()); + } + +}