package com.alibaba.druid.bvt.pool.exception; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.concurrent.CountDownLatch; 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.vendor.OracleExceptionSorter; import com.alibaba.druid.stat.DruidDataSourceStatManager; import com.alibaba.druid.stat.JdbcStatManager; import com.alibaba.druid.test.util.OracleMockDriver; import com.alibaba.druid.util.JdbcUtils; public class OracleExceptionSorterTest_concurrent extends TestCase { private DruidDataSource dataSource; protected void setUp() throws Exception { Assert.assertEquals(0, JdbcStatManager.getInstance().getSqlList().size()); dataSource = new DruidDataSource(); dataSource.setExceptionSorter(new OracleExceptionSorter()); dataSource.setDriver(new OracleMockDriver()); dataSource.setUrl("jdbc:mock:xxx"); dataSource.setPoolPreparedStatements(true); dataSource.setMaxOpenPreparedStatements(100); dataSource.setMaxActive(1); dataSource.setMaxWait(1000 * 100); } @Override protected void tearDown() throws Exception { JdbcUtils.close(dataSource); Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size()); } public void test_connect() throws Exception { final CountDownLatch latch_0 = new CountDownLatch(1); Thread errorThread = new Thread() { public void run() { try { Connection conn = dataSource.getConnection(); latch_0.countDown(); MockConnection mockConn = conn.unwrap(MockConnection.class); Assert.assertNotNull(mockConn); SQLException exception = new SQLException("xx", "xxx", 28); mockConn.setError(exception); try { conn.createStatement(); } catch (SQLException ex) { // ex.printStackTrace(); } conn.close(); } catch (Exception error) { error.printStackTrace(); } } }; errorThread.start(); final CountDownLatch workLatch = new CountDownLatch(2); final CountDownLatch workCompleteLatch = new CountDownLatch(2); for (int i = 0; i < 2; ++i) { Thread thread = new Thread() { public void run() { try { for (int i = 0; i < 1000; ++i) { workLatch.countDown(); Connection conn = dataSource.getConnection(); conn.close(); } } catch (Exception ex) { ex.printStackTrace(); } finally { workCompleteLatch.countDown(); } } }; thread.start(); } workLatch.await(); latch_0.countDown(); workCompleteLatch.await(); Assert.assertEquals(2001, dataSource.getConnectCount()); } }