diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 4378290d40..05ee7ae385 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -556,7 +556,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat for (int i = 0; i < poolingCount; ++i) { try { - connections[i].getConnection().close(); + JdbcUtils.close(connections[i].getConnection()); connections[i] = null; destroyCount++; } catch (Exception ex) { diff --git a/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_close_error.java b/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_close_error.java new file mode 100644 index 0000000000..4ee15de790 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_close_error.java @@ -0,0 +1,78 @@ +package com.alibaba.druid.bvt.filter; + +import java.sql.SQLException; +import java.util.Properties; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.filter.FilterChainImpl; +import com.alibaba.druid.filter.trace.TraceFilter; +import com.alibaba.druid.mock.MockConnection; +import com.alibaba.druid.mock.MockDriver; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl; +import com.alibaba.druid.stat.DruidDataSourceStatManager; +import com.alibaba.druid.stat.JdbcStatContext; +import com.alibaba.druid.stat.JdbcStatManager; + +public class TraceFilterTest_close_error extends TestCase { + + private MockDriver driver; + private DruidDataSource dataSource; + private TraceFilter filter; + + protected void setUp() throws Exception { + Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size()); + + driver = new MockDriver() { + + }; + + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setDriver(driver); + dataSource.setInitialSize(1); + dataSource.setMaxActive(2); + dataSource.setMaxIdle(2); + dataSource.setMinIdle(1); + dataSource.setMinEvictableIdleTimeMillis(300 * 1000); // 300 / 10 + dataSource.setTimeBetweenEvictionRunsMillis(180 * 1000); // 180 / 10 + dataSource.setTestWhileIdle(true); + dataSource.setTestOnBorrow(false); + dataSource.setValidationQuery("SELECT 1"); + dataSource.setFilters("trace"); + + filter = (TraceFilter) dataSource.getProxyFilters().get(0); + JdbcStatContext statContext = new JdbcStatContext(); + statContext.setTraceEnable(true); + JdbcStatManager.getInstance().setStatContext(statContext); + } + + protected void tearDown() throws Exception { + dataSource.close(); + Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size()); + JdbcStatManager.getInstance().setStatContext(null); + } + + public void test_exuecute() throws Exception { + FilterChainImpl chain = new FilterChainImpl(dataSource); + + MockConnection conn = new MockConnection() { + public void close() throws SQLException { + throw new SQLException(); + } + }; + + { + SQLException error = null; + try { + filter.connection_close(chain, new ConnectionProxyImpl(dataSource, conn, new Properties(), 0)); + } catch (SQLException ex) { + error = ex; + } + Assert.assertNotNull(error); + } + + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_connect_error.java b/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_connect_error.java new file mode 100644 index 0000000000..1f65366794 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_connect_error.java @@ -0,0 +1,72 @@ +package com.alibaba.druid.bvt.filter; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Properties; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.filter.trace.TraceFilter; +import com.alibaba.druid.mock.MockDriver; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.stat.DruidDataSourceStatManager; +import com.alibaba.druid.stat.JdbcStatContext; +import com.alibaba.druid.stat.JdbcStatManager; + +public class TraceFilterTest_connect_error extends TestCase { + + private MockDriver driver; + private DruidDataSource dataSource; + private TraceFilter filter; + + protected void setUp() throws Exception { + Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size()); + + driver = new MockDriver() { + + public Connection connect(String url, Properties info) throws SQLException { + throw new SQLException(); + } + }; + + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setDriver(driver); + dataSource.setInitialSize(1); + dataSource.setMaxActive(2); + dataSource.setMaxIdle(2); + dataSource.setMinIdle(1); + dataSource.setMinEvictableIdleTimeMillis(300 * 1000); // 300 / 10 + dataSource.setTimeBetweenEvictionRunsMillis(180 * 1000); // 180 / 10 + dataSource.setTestWhileIdle(true); + dataSource.setTestOnBorrow(false); + dataSource.setValidationQuery("SELECT 1"); + dataSource.setFilters("trace"); + + filter = (TraceFilter) dataSource.getProxyFilters().get(0); + JdbcStatContext statContext = new JdbcStatContext(); + statContext.setTraceEnable(true); + JdbcStatManager.getInstance().setStatContext(statContext); + } + + protected void tearDown() throws Exception { + dataSource.close(); + Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size()); + JdbcStatManager.getInstance().setStatContext(null); + } + + public void test_exuecute() throws Exception { + { + SQLException error = null; + try { + dataSource.getConnection(); + } catch (SQLException ex) { + error = ex; + } + Assert.assertNotNull(error); + } + + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_connect_error_2.java b/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_connect_error_2.java new file mode 100644 index 0000000000..03949f3ace --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/TraceFilterTest_connect_error_2.java @@ -0,0 +1,72 @@ +package com.alibaba.druid.bvt.filter; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Properties; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.filter.trace.TraceFilter; +import com.alibaba.druid.mock.MockDriver; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.stat.DruidDataSourceStatManager; +import com.alibaba.druid.stat.JdbcStatContext; +import com.alibaba.druid.stat.JdbcStatManager; + +public class TraceFilterTest_connect_error_2 extends TestCase { + + private MockDriver driver; + private DruidDataSource dataSource; + private TraceFilter filter; + + protected void setUp() throws Exception { + Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size()); + + driver = new MockDriver() { + + public Connection connect(String url, Properties info) throws SQLException { + throw new RuntimeException(); + } + }; + + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setDriver(driver); + dataSource.setInitialSize(1); + dataSource.setMaxActive(2); + dataSource.setMaxIdle(2); + dataSource.setMinIdle(1); + dataSource.setMinEvictableIdleTimeMillis(300 * 1000); // 300 / 10 + dataSource.setTimeBetweenEvictionRunsMillis(180 * 1000); // 180 / 10 + dataSource.setTestWhileIdle(true); + dataSource.setTestOnBorrow(false); + dataSource.setValidationQuery("SELECT 1"); + dataSource.setFilters("trace"); + + filter = (TraceFilter) dataSource.getProxyFilters().get(0); + JdbcStatContext statContext = new JdbcStatContext(); + statContext.setTraceEnable(true); + JdbcStatManager.getInstance().setStatContext(statContext); + } + + protected void tearDown() throws Exception { + dataSource.close(); + Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size()); + JdbcStatManager.getInstance().setStatContext(null); + } + + public void test_exuecute() throws Exception { + { + Exception error = null; + try { + dataSource.getConnection(); + } catch (Exception ex) { + error = ex; + } + Assert.assertNotNull(error); + } + + } + +}