You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2023/01/21 22:55:36 UTC

[commons-dbcp] branch master updated: Use try-with-resource

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-dbcp.git


The following commit(s) were added to refs/heads/master by this push:
     new 1a903853 Use try-with-resource
1a903853 is described below

commit 1a9038536bc71d4c342638bc0c9710dbbb61a15d
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sat Jan 21 17:55:32 2023 -0500

    Use try-with-resource
---
 .../apache/commons/dbcp2/TestBasicDataSource.java  | 325 +++++++++++----------
 1 file changed, 164 insertions(+), 161 deletions(-)

diff --git a/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java b/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java
index e30e8edf..dd99ae0e 100644
--- a/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java
+++ b/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java
@@ -159,12 +159,7 @@ public class TestBasicDataSource extends TestConnectionPool {
         assertTrue(rawActiveConnection.isClosed());
 
         // Verify SQLException on getConnection after close
-        try {
-            getConnection();
-            fail("Expecting SQLException");
-        } catch (final SQLException ex) {
-            // Expected
-        }
+        assertThrows(SQLException.class, () -> getConnection());
 
         // Redundant close is OK
         ds.close();
@@ -178,22 +173,22 @@ public class TestBasicDataSource extends TestConnectionPool {
         ds.setInitialSize(8);
 
         // Launch a request to trigger pool initialization
-        final TestThread testThread = new TestThread(1,0);
+        final TestThread testThread = new TestThread(1, 0);
         final Thread t = new Thread(testThread);
         t.start();
 
         // Get another connection (should wait for pool init)
         Thread.sleep(100); // Make sure t gets into init first
-        ds.getConnection();
+        try (Connection conn = ds.getConnection()) {
 
-        // Pool should have at least 6 idle connections now
-        // Use underlying pool getNumIdle to avoid waiting for ds lock
-        assertTrue(ds.getConnectionPool().getNumIdle() > 5);
-
-        // Make sure t completes successfully
-        t.join();
-        assertFalse(testThread.failed());
+            // Pool should have at least 6 idle connections now
+            // Use underlying pool getNumIdle to avoid waiting for ds lock
+            assertTrue(ds.getConnectionPool().getNumIdle() > 5);
 
+            // Make sure t completes successfully
+            t.join();
+            assertFalse(testThread.failed());
+        }
         ds.close();
     }
 
@@ -239,35 +234,41 @@ public class TestBasicDataSource extends TestConnectionPool {
      * Verify that ConnectionFactory interface in BasicDataSource.createConnectionFactory().
      */
     @Test
-    public void testCreateConnectionFactory() throws Exception {
-
-        /* not set ConnectionFactoryClassName */
-    	Properties properties = new Properties();
+    public void testCreateConnectionFactoryWithConnectionFactoryClassName() throws Exception {
+        Properties properties = new Properties();
+        // set ConnectionFactoryClassName
+        properties = new Properties();
         properties.put("initialSize", "1");
         properties.put("driverClassName", "org.apache.commons.dbcp2.TesterDriver");
         properties.put("url", "jdbc:apache:commons:testdriver");
         properties.put("username", "foo");
         properties.put("password", "bar");
-        BasicDataSource ds = BasicDataSourceFactory.createDataSource(properties);
-        Connection conn = ds.getConnection();
-        assertNotNull(conn);
-        conn.close();
-        ds.close();
+        properties.put("connectionFactoryClassName", "org.apache.commons.dbcp2.TesterConnectionFactory");
+        try (BasicDataSource ds = BasicDataSourceFactory.createDataSource(properties)) {
+            try (Connection conn = ds.getConnection()) {
+                assertNotNull(conn);
+            }
+        }
+    }
 
-        /* set ConnectionFactoryClassName */
-        properties = new Properties();
+    /**
+     * JIRA: DBCP-547
+     * Verify that ConnectionFactory interface in BasicDataSource.createConnectionFactory().
+     */
+    @Test
+    public void testCreateConnectionFactoryWithoutConnectionFactoryClassName() throws Exception {
+        // not set ConnectionFactoryClassName
+        final Properties properties = new Properties();
         properties.put("initialSize", "1");
         properties.put("driverClassName", "org.apache.commons.dbcp2.TesterDriver");
         properties.put("url", "jdbc:apache:commons:testdriver");
         properties.put("username", "foo");
         properties.put("password", "bar");
-        properties.put("connectionFactoryClassName", "org.apache.commons.dbcp2.TesterConnectionFactory");
-        ds = BasicDataSourceFactory.createDataSource(properties);
-        conn = ds.getConnection();
-        assertNotNull(conn);
-
-        conn.close();
-        ds.close();
+        try (BasicDataSource ds = BasicDataSourceFactory.createDataSource(properties)) {
+            try (Connection conn = ds.getConnection()) {
+                assertNotNull(conn);
+            }
+        }
     }
 
     /**
@@ -378,48 +379,49 @@ public class TestBasicDataSource extends TestConnectionPool {
 
     @Test
     public void testDeprecatedAccessors() throws SQLException {
-        final BasicDataSource bds = new BasicDataSource();
-        int i = 0;
-        //
-        i++;
-        bds.setDefaultQueryTimeout(i);
-        assertEquals(i, bds.getDefaultQueryTimeout());
-        assertEquals(Duration.ofSeconds(i), bds.getDefaultQueryTimeoutDuration());
-        //
-        i++;
-        bds.setMaxConnLifetimeMillis(i);
-        assertEquals(i, bds.getMaxConnLifetimeMillis());
-        assertEquals(Duration.ofMillis(i), bds.getMaxConnDuration());
-        //
-        i++;
-        bds.setMaxWaitMillis(i);
-        assertEquals(i, bds.getMaxWaitMillis());
-        assertEquals(Duration.ofMillis(i), bds.getMaxWaitDuration());
-        //
-        i++;
-        bds.setMinEvictableIdleTimeMillis(i);
-        assertEquals(i, bds.getMinEvictableIdleTimeMillis());
-        assertEquals(Duration.ofMillis(i), bds.getMinEvictableIdleDuration());
-        //
-        i++;
-        bds.setRemoveAbandonedTimeout(i);
-        assertEquals(i, bds.getRemoveAbandonedTimeout());
-        assertEquals(Duration.ofSeconds(i), bds.getRemoveAbandonedTimeoutDuration());
-        //
-        i++;
-        bds.setSoftMinEvictableIdleTimeMillis(i);
-        assertEquals(i, bds.getSoftMinEvictableIdleTimeMillis());
-        assertEquals(Duration.ofMillis(i), bds.getSoftMinEvictableIdleDuration());
-        //
-        i++;
-        bds.setTimeBetweenEvictionRunsMillis(i);
-        assertEquals(i, bds.getTimeBetweenEvictionRunsMillis());
-        assertEquals(Duration.ofMillis(i), bds.getDurationBetweenEvictionRuns());
-        //
-        i++;
-        bds.setValidationQueryTimeout(1);
-        assertEquals(1, bds.getValidationQueryTimeout());
-        assertEquals(Duration.ofSeconds(1), bds.getValidationQueryTimeoutDuration());
+        try (BasicDataSource bds = new BasicDataSource()) {
+            int i = 0;
+            //
+            i++;
+            bds.setDefaultQueryTimeout(i);
+            assertEquals(i, bds.getDefaultQueryTimeout());
+            assertEquals(Duration.ofSeconds(i), bds.getDefaultQueryTimeoutDuration());
+            //
+            i++;
+            bds.setMaxConnLifetimeMillis(i);
+            assertEquals(i, bds.getMaxConnLifetimeMillis());
+            assertEquals(Duration.ofMillis(i), bds.getMaxConnDuration());
+            //
+            i++;
+            bds.setMaxWaitMillis(i);
+            assertEquals(i, bds.getMaxWaitMillis());
+            assertEquals(Duration.ofMillis(i), bds.getMaxWaitDuration());
+            //
+            i++;
+            bds.setMinEvictableIdleTimeMillis(i);
+            assertEquals(i, bds.getMinEvictableIdleTimeMillis());
+            assertEquals(Duration.ofMillis(i), bds.getMinEvictableIdleDuration());
+            //
+            i++;
+            bds.setRemoveAbandonedTimeout(i);
+            assertEquals(i, bds.getRemoveAbandonedTimeout());
+            assertEquals(Duration.ofSeconds(i), bds.getRemoveAbandonedTimeoutDuration());
+            //
+            i++;
+            bds.setSoftMinEvictableIdleTimeMillis(i);
+            assertEquals(i, bds.getSoftMinEvictableIdleTimeMillis());
+            assertEquals(Duration.ofMillis(i), bds.getSoftMinEvictableIdleDuration());
+            //
+            i++;
+            bds.setTimeBetweenEvictionRunsMillis(i);
+            assertEquals(i, bds.getTimeBetweenEvictionRunsMillis());
+            assertEquals(Duration.ofMillis(i), bds.getDurationBetweenEvictionRuns());
+            //
+            i++;
+            bds.setValidationQueryTimeout(1);
+            assertEquals(1, bds.getValidationQueryTimeout());
+            assertEquals(Duration.ofSeconds(1), bds.getValidationQueryTimeoutDuration());
+        }
     }
 
     /**
@@ -433,13 +435,13 @@ public class TestBasicDataSource extends TestConnectionPool {
         disconnectionSqlCodes.add("XXX");
         ds.setDisconnectionSqlCodes(disconnectionSqlCodes);
         ds.setFastFailValidation(true);
-        ds.getConnection();  // Triggers initialization - pcf creation
-        // Make sure factory got the properties
-        final PoolableConnectionFactory pcf =
-                (PoolableConnectionFactory) ds.getConnectionPool().getFactory();
-        assertTrue(pcf.isFastFailValidation());
-        assertTrue(pcf.getDisconnectionSqlCodes().contains("XXX"));
-        assertEquals(1, pcf.getDisconnectionSqlCodes().size());
+        try (Connection conn = ds.getConnection()) { // Triggers initialization - pcf creation
+            // Make sure factory got the properties
+            final PoolableConnectionFactory pcf = (PoolableConnectionFactory) ds.getConnectionPool().getFactory();
+            assertTrue(pcf.isFastFailValidation());
+            assertTrue(pcf.getDisconnectionSqlCodes().contains("XXX"));
+            assertEquals(1, pcf.getDisconnectionSqlCodes().size());
+        }
     }
 
     /**
@@ -448,11 +450,12 @@ public class TestBasicDataSource extends TestConnectionPool {
      */
     @Test
     public void testDriverClassLoader() throws Exception {
-        getConnection();
-        final ClassLoader cl = ds.getDriverClassLoader();
-        assertNotNull(cl);
-        assertTrue(cl instanceof TesterClassLoader);
-        assertTrue(((TesterClassLoader) cl).didLoad(ds.getDriverClassName()));
+        try (Connection conn = getConnection()) {
+            final ClassLoader cl = ds.getDriverClassLoader();
+            assertNotNull(cl);
+            assertTrue(cl instanceof TesterClassLoader);
+            assertTrue(((TesterClassLoader) cl).didLoad(ds.getDriverClassName()));
+        }
     }
 
     @Test
@@ -491,8 +494,9 @@ public class TestBasicDataSource extends TestConnectionPool {
         ds.setDurationBetweenEvictionRuns(Duration.ofMillis(delay));
         ds.setPoolPreparedStatements(true);
 
-        final Connection conn = ds.getConnection();
-        conn.close();
+        try (Connection conn = ds.getConnection()) {
+            // empty
+        }
 
         final ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
         while (Stream.of(threadBean.getThreadInfo(threadBean.getAllThreadIds())).anyMatch(t -> t.getThreadName().equals("commons-pool-evictor-thread"))) {
@@ -512,9 +516,9 @@ public class TestBasicDataSource extends TestConnectionPool {
         ds.setMaxIdle(20);
         ds.setInitialSize(10);
 
-        final Connection conn = getConnection();
-        assertNotNull(conn);
-        conn.close();
+        try (Connection conn = getConnection()) {
+            assertNotNull(conn);
+        }
 
         assertEquals(0, ds.getNumActive());
         assertEquals(10, ds.getNumIdle());
@@ -593,14 +597,10 @@ public class TestBasicDataSource extends TestConnectionPool {
         assertEquals(1, ds.getNumActive());
 
         // set an IO failure causing the isClosed method to fail
-        final TesterConnection tconn = (TesterConnection) ((DelegatingConnection<?>)conn).getInnermostDelegate();
+        final TesterConnection tconn = (TesterConnection) ((DelegatingConnection<?>) conn).getInnermostDelegate();
         tconn.setFailure(new IOException("network error"));
 
-        try {
-            conn.close();
-            fail("Expected SQLException");
-        }
-        catch(final SQLException ex) { }
+        assertThrows(SQLException.class, () -> conn.close());
 
         assertEquals(0, ds.getNumActive());
     }
@@ -626,11 +626,12 @@ public class TestBasicDataSource extends TestConnectionPool {
         for (final ObjectName result : results) {
             mbs.unregisterMBean(result);
         }
-        ds.setJmxName(null);  // Should disable JMX for both connection and statement pools
+        ds.setJmxName(null); // Should disable JMX for both connection and statement pools
         ds.setPoolPreparedStatements(true);
-        ds.getConnection();  // Trigger initialization
-        // Nothing should be registered
-        assertEquals(0, mbs.queryNames(commons, null).size());
+        try (Connection conn = ds.getConnection()) { // Trigger initialization
+            // Nothing should be registered
+            assertEquals(0, mbs.queryNames(commons, null).size());
+        }
     }
 
     /**
@@ -647,10 +648,11 @@ public class TestBasicDataSource extends TestConnectionPool {
             mbs.unregisterMBean(result);
         }
         ds.setRegisterConnectionMBean(false); // Should disable Connection MBean registration
-        ds.getConnection();  // Trigger initialization
-        // No Connection MBeans shall be registered
-        final ObjectName connections = new ObjectName("org.apache.commons.*:connection=*,*");
-        assertEquals(0, mbs.queryNames(connections, null).size());
+        try (Connection conn = ds.getConnection()) { // Trigger initialization
+            // No Connection MBeans shall be registered
+            final ObjectName connections = new ObjectName("org.apache.commons.*:connection=*,*");
+            assertEquals(0, mbs.queryNames(connections, null).size());
+        }
     }
 
     /**
@@ -688,13 +690,9 @@ public class TestBasicDataSource extends TestConnectionPool {
         ds.setMinEvictableIdle(Duration.ofMillis(10));
         ds.setNumTestsPerEvictionRun(2);
 
-        final Connection ds2 = ds.createDataSource().getConnection();
-        final Connection ds3 = ds.createDataSource().getConnection();
-
-        assertEquals(0, ds.getNumIdle());
-
-        ds2.close();
-        ds3.close();
+        try (Connection ds2 = ds.createDataSource().getConnection(); Connection ds3 = ds.createDataSource().getConnection()) {
+            assertEquals(0, ds.getNumIdle());
+        }
 
         // Make sure MinEvictableIdleTimeMillis has elapsed
         Thread.sleep(100);
@@ -714,10 +712,10 @@ public class TestBasicDataSource extends TestConnectionPool {
         try {
             StackMessageLog.lock();
             ds.setMaxConn(Duration.ofMillis(100));
-            final Connection conn = ds.getConnection();
-            assertEquals(1, ds.getNumActive());
-            Thread.sleep(500);
-            conn.close();
+            try (Connection conn = ds.getConnection()) {
+                assertEquals(1, ds.getNumActive());
+                Thread.sleep(500);
+            }
             assertEquals(0, ds.getNumIdle());
             final String message = StackMessageLog.popMessage();
             Assertions.assertNotNull(message);
@@ -779,10 +777,11 @@ public class TestBasicDataSource extends TestConnectionPool {
         properties.put("url", "jdbc:apache:commons:testdriver");
         properties.put("username", "foo");
         properties.put("password", "bar");
-        final BasicDataSource ds = BasicDataSourceFactory.createDataSource(properties);
-        final boolean original = ds.getConnectionPool().getLogAbandoned();
-        ds.setLogAbandoned(!original);
-        Assertions.assertNotEquals(original, ds.getConnectionPool().getLogAbandoned());
+        try (BasicDataSource ds = BasicDataSourceFactory.createDataSource(properties)) {
+            final boolean original = ds.getConnectionPool().getLogAbandoned();
+            ds.setLogAbandoned(!original);
+            Assertions.assertNotEquals(original, ds.getConnectionPool().getLogAbandoned());
+        }
     }
 
     @Test
@@ -790,12 +789,13 @@ public class TestBasicDataSource extends TestConnectionPool {
         // default: false
         assertFalse(ds.isAccessToUnderlyingConnectionAllowed());
 
-        final Connection conn = getConnection();
-        Connection dconn = ((DelegatingConnection<?>) conn).getDelegate();
-        assertNull(dconn);
+        try (Connection conn = getConnection()) {
+            Connection dconn = ((DelegatingConnection<?>) conn).getDelegate();
+            assertNull(dconn);
 
-        dconn = ((DelegatingConnection<?>) conn).getInnermostDelegate();
-        assertNull(dconn);
+            dconn = ((DelegatingConnection<?>) conn).getInnermostDelegate();
+            assertNull(dconn);
+        }
     }
 
     /**
@@ -807,10 +807,11 @@ public class TestBasicDataSource extends TestConnectionPool {
     public void testPoolCloseCheckedException() throws Exception {
         ds.setAccessToUnderlyingConnectionAllowed(true);  // Allow dirty tricks
 
+        final TesterConnection tc;
         // Get an idle connection into the pool
-        final Connection conn = ds.getConnection();
-        final TesterConnection tc = (TesterConnection) ((DelegatingConnection<?>) conn).getInnermostDelegate();
-        conn.close();
+        try (Connection conn = ds.getConnection()) {
+            tc = (TesterConnection) ((DelegatingConnection<?>) conn).getInnermostDelegate();
+        }
 
         // After returning the connection to the pool, bork it.
         // Don't try this at home - bad violation of pool contract!
@@ -839,9 +840,10 @@ public class TestBasicDataSource extends TestConnectionPool {
     public void testPoolCloseRTE() throws Exception {
         // RTE version of testPoolCloseCheckedException - see comments there.
         ds.setAccessToUnderlyingConnectionAllowed(true);
-        final Connection conn = ds.getConnection();
-        final TesterConnection tc = (TesterConnection) ((DelegatingConnection<?>) conn).getInnermostDelegate();
-        conn.close();
+        final TesterConnection tc;
+        try (Connection conn = ds.getConnection()) {
+            tc = (TesterConnection) ((DelegatingConnection<?>) conn).getInnermostDelegate();
+        }
         tc.setFailure(new IllegalStateException("boom"));
         try {
             StackMessageLog.lock();
@@ -877,12 +879,13 @@ public class TestBasicDataSource extends TestConnectionPool {
         ds.setTestWhileIdle(false);
         ds.setTestOnReturn(true);
 
-        final Connection conn = ds.getConnection();
-        assertNotNull(conn);
+        try (Connection conn = ds.getConnection()) {
+            assertNotNull(conn);
 
-        assertFalse(ds.getConnectionPool().getTestOnBorrow());
-        assertFalse(ds.getConnectionPool().getTestWhileIdle());
-        assertTrue(ds.getConnectionPool().getTestOnReturn());
+            assertFalse(ds.getConnectionPool().getTestOnBorrow());
+            assertFalse(ds.getConnectionPool().getTestWhileIdle());
+            assertTrue(ds.getConnectionPool().getTestOnReturn());
+        }
     }
 
     @Test
@@ -893,19 +896,19 @@ public class TestBasicDataSource extends TestConnectionPool {
         ds.setMinEvictableIdle(Duration.ofMinutes(1));
         ds.setInitialSize(2);
         ds.setDefaultCatalog("foo");
-        final Connection conn1 = ds.getConnection();
-        Thread.sleep(200);
-        // Now set some property that will not have effect until restart
-        ds.setDefaultCatalog("bar");
-        ds.setInitialSize(1);
-        // restart will load new properties
-        ds.restart();
-        assertEquals("bar", ds.getDefaultCatalog());
-        assertEquals(1, ds.getInitialSize());
-        ds.getLogWriter();  // side effect is to init
-        assertEquals(0, ds.getNumActive());
-        assertEquals(1, ds.getNumIdle());
-        conn1.close();
+        try (Connection conn1 = ds.getConnection()) {
+            Thread.sleep(200);
+            // Now set some property that will not have effect until restart
+            ds.setDefaultCatalog("bar");
+            ds.setInitialSize(1);
+            // restart will load new properties
+            ds.restart();
+            assertEquals("bar", ds.getDefaultCatalog());
+            assertEquals(1, ds.getInitialSize());
+            ds.getLogWriter(); // side effect is to init
+            assertEquals(0, ds.getNumActive());
+            assertEquals(1, ds.getNumIdle());
+        }
         // verify old pool connection is not returned to pool
         assertEquals(1, ds.getNumIdle());
         ds.close();
@@ -921,25 +924,25 @@ public class TestBasicDataSource extends TestConnectionPool {
         ds.setDefaultReadOnly(Boolean.TRUE);
         ds.setDefaultAutoCommit(Boolean.FALSE);
 
-        final Connection conn = ds.getConnection();
-        assertNotNull(conn);
-        conn.close();
+        try (Connection conn = ds.getConnection()) {
+            assertNotNull(conn);
+        }
     }
 
     @Test
     public void testSetAutoCommitTrueOnClose() throws Exception {
         ds.setAccessToUnderlyingConnectionAllowed(true);
         ds.setDefaultAutoCommit(Boolean.FALSE);
+        final Connection dconn;
+        try (Connection conn = getConnection()) {
+            assertNotNull(conn);
+            assertFalse(conn.getAutoCommit());
 
-        final Connection conn = getConnection();
-        assertNotNull(conn);
-        assertFalse(conn.getAutoCommit());
-
-        final Connection dconn = ((DelegatingConnection<?>) conn).getInnermostDelegate();
-        assertNotNull(dconn);
-        assertFalse(dconn.getAutoCommit());
+            dconn = ((DelegatingConnection<?>) conn).getInnermostDelegate();
+            assertNotNull(dconn);
+            assertFalse(dconn.getAutoCommit());
 
-        conn.close();
+        }
 
         assertTrue(dconn.getAutoCommit());
     }