commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From d...@apache.org
Subject svn commit: r558884 - in /jakarta/commons/proper/dbcp/trunk: ./ src/java/org/apache/commons/dbcp/ src/java/org/apache/commons/dbcp/managed/ src/test/org/apache/commons/dbcp/ src/test/org/apache/commons/dbcp/managed/
Date Mon, 23 Jul 2007 22:28:38 GMT
Author: dain
Date: Mon Jul 23 15:28:37 2007
New Revision: 558884

URL: http://svn.apache.org/viewvc?view=rev&rev=558884
Log:
DBCP-221 Changed BasicDataSource.close() to permanently mark the data source as closed.  At
close all idle connections are destroyed and the method returns.  As existing active connections
are closed, they are destroyed.

Added:
    jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/managed/TestBasicManagedDataSource.java
Modified:
    jakarta/commons/proper/dbcp/trunk/pom.xml
    jakarta/commons/proper/dbcp/trunk/project.xml
    jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/BasicDataSource.java
    jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolableConnection.java
    jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/managed/ManagedConnection.java
    jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestAll.java
    jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestBasicDataSource.java

Modified: jakarta/commons/proper/dbcp/trunk/pom.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/pom.xml?view=diff&rev=558884&r1=558883&r2=558884
==============================================================================
--- jakarta/commons/proper/dbcp/trunk/pom.xml (original)
+++ jakarta/commons/proper/dbcp/trunk/pom.xml Mon Jul 23 15:28:37 2007
@@ -236,6 +236,7 @@
                 <include>org/apache/commons/dbcp/datasources/TestPerUserPoolDataSource.java</include>
                 <include>org/apache/commons/dbcp/datasources/TestSharedPoolDataSource.java</include>
 
+                <include>org/apache/commons/dbcp/managed/TestBasicManagedDataSource.java</include>
                 <include>org/apache/commons/dbcp/managed/TestManagedDataSource.java</include>
                 <include>org/apache/commons/dbcp/managed/TestManagedDataSourceInTx.java</include>
               </includes>

Modified: jakarta/commons/proper/dbcp/trunk/project.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/project.xml?view=diff&rev=558884&r1=558883&r2=558884
==============================================================================
--- jakarta/commons/proper/dbcp/trunk/project.xml (original)
+++ jakarta/commons/proper/dbcp/trunk/project.xml Mon Jul 23 15:28:37 2007
@@ -354,6 +354,10 @@
         <include>org/apache/commons/dbcp/datasources/TestFactory.java</include>
         <include>org/apache/commons/dbcp/datasources/TestPerUserPoolDataSource.java</include>
         <include>org/apache/commons/dbcp/datasources/TestSharedPoolDataSource.java</include>
+
+        <include>org/apache/commons/dbcp/managed/TestBasicManagedDataSource.java</include>
+        <include>org/apache/commons/dbcp/managed/TestManagedDataSource.java</include>
+        <include>org/apache/commons/dbcp/managed/TestManagedDataSourceInTx.java</include>
       </includes>
       <resources>
         <resource>

Modified: jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/BasicDataSource.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/BasicDataSource.java?view=diff&rev=558884&r1=558883&r2=558884
==============================================================================
--- jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/BasicDataSource.java
(original)
+++ jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/BasicDataSource.java
Mon Jul 23 15:28:37 2007
@@ -1093,7 +1093,7 @@
     }
 
     /**
-     * Sets the connection properties passed to driver.connect(...). 
+     * Sets the connection properties passed to driver.connect(...).
      *
      * Format of the string must be [propertyName=property;]*
      *
@@ -1126,13 +1126,18 @@
         this.restartNeeded = true;
     }
 
+    protected boolean closed;
+
     /**
      * Close and release all connections that are currently stored in the
-     * connection pool associated with our data source.
+     * connection pool associated with our data source.  All open (active)
+     * connection remain open until closed.  Once the data source has
+     * been closed, no more connections can be obtained.
      *
      * @throws SQLException if a database error occurs
      */
     public synchronized void close() throws SQLException {
+        closed = true;
         GenericObjectPool oldpool = connectionPool;
         connectionPool = null;
         dataSource = null;
@@ -1149,6 +1154,13 @@
         }
     }
 
+    /**
+     * If true, this data source is closed and no more connections can be retrieved from
this datasource.
+     * @return true, if the data source is closed; false otherwise
+     */
+    public synchronized boolean isClosed() {
+        return closed;
+    }
 
     // ------------------------------------------------------ Protected Methods
 
@@ -1167,6 +1179,9 @@
      */
     protected synchronized DataSource createDataSource()
         throws SQLException {
+        if (closed) {
+            throw new SQLException("Data source is closed");
+        }
 
         // Return the pool if we have already created it
         if (dataSource != null) {

Modified: jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolableConnection.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolableConnection.java?view=diff&rev=558884&r1=558883&r2=558884
==============================================================================
--- jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolableConnection.java
(original)
+++ jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolableConnection.java
Mon Jul 23 15:28:37 2007
@@ -70,6 +70,10 @@
         } catch (SQLException e) {
             try {
                 _pool.invalidateObject(this); // XXX should be guarded to happen at most
once
+            } catch(IllegalStateException ise) {
+                // pool is closed, so close the connection
+                passivate();
+                getInnermostDelegate().close();
             } catch (Exception ie) {
                 // DO NOTHING the original exception will be rethrown
             }
@@ -78,6 +82,10 @@
         if (isClosed) {
             try {
                 _pool.invalidateObject(this); // XXX should be guarded to happen at most
once
+            } catch(IllegalStateException e) {
+                // pool is closed, so close the connection
+                passivate();
+                getInnermostDelegate().close();
             } catch (Exception ie) {
                 // DO NOTHING, "Already closed" exception thrown below
             }
@@ -85,6 +93,10 @@
         } else {
             try {
                 _pool.returnObject(this); // XXX should be guarded to happen at most once
+            } catch(IllegalStateException e) {
+                // pool is closed, so close the connection
+                passivate();
+                getInnermostDelegate().close();
             } catch(SQLException e) {
                 throw e;
             } catch(RuntimeException e) {

Modified: jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/managed/ManagedConnection.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/managed/ManagedConnection.java?view=diff&rev=558884&r1=558883&r2=558884
==============================================================================
--- jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/managed/ManagedConnection.java
(original)
+++ jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/managed/ManagedConnection.java
Mon Jul 23 15:28:37 2007
@@ -139,13 +139,7 @@
     }
 
     public void close() throws SQLException {
-        // close can be called multiple times, but PoolableConnection improperly
-        // throws an exception when a connection is closed twice, so before calling
-        // close we aren't alreayd closed
-        if (!isClosed()) {
-
-            // don't use super.close() because it calls passivate() which marks the
-            // the connection as cloased without returning it to the pool
+        if (!_closed) {
             try {
                 // don't actually close the connection if in a transaction
                 // the connection will be closed by the transactionComplete method

Modified: jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestAll.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestAll.java?view=diff&rev=558884&r1=558883&r2=558884
==============================================================================
--- jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestAll.java (original)
+++ jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestAll.java Mon Jul
23 15:28:37 2007
@@ -17,10 +17,15 @@
 
 package org.apache.commons.dbcp;
 
-import junit.framework.*;
-import org.apache.commons.dbcp.datasources.TestSharedPoolDataSource;
-import org.apache.commons.dbcp.datasources.TestPerUserPoolDataSource;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
 import org.apache.commons.dbcp.datasources.TestFactory;
+import org.apache.commons.dbcp.datasources.TestPerUserPoolDataSource;
+import org.apache.commons.dbcp.datasources.TestSharedPoolDataSource;
+import org.apache.commons.dbcp.managed.TestBasicManagedDataSource;
+import org.apache.commons.dbcp.managed.TestManagedDataSource;
+import org.apache.commons.dbcp.managed.TestManagedDataSourceInTx;
 import org.apache.commons.jocl.TestJOCLContentHandler;
 
 /**
@@ -51,6 +56,9 @@
         suite.addTest(TestJOCLContentHandler.suite());
         suite.addTest(TestPoolingDataSource.suite());
         suite.addTest(TestJndi.suite());
+        suite.addTest(TestBasicManagedDataSource.suite());
+        suite.addTest(TestManagedDataSource.suite());
+        suite.addTest(TestManagedDataSourceInTx.suite());
         return suite;
     }
 

Modified: jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestBasicDataSource.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestBasicDataSource.java?view=diff&rev=558884&r1=558883&r2=558884
==============================================================================
--- jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestBasicDataSource.java
(original)
+++ jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestBasicDataSource.java
Mon Jul 23 15:28:37 2007
@@ -48,7 +48,7 @@
 
     public void setUp() throws Exception {
         super.setUp();
-        ds = new BasicDataSource();
+        ds = createDataSource();
         ds.setDriverClassName("org.apache.commons.dbcp.TesterDriver");
         ds.setUrl("jdbc:apache:commons:testdriver");
         ds.setMaxActive(getMaxActive());
@@ -62,12 +62,53 @@
         ds.setValidationQuery("SELECT DUMMY FROM DUAL");
     }
 
+    protected BasicDataSource createDataSource() throws Exception {
+        return new BasicDataSource();
+    }
+
     public void tearDown() throws Exception {
         super.tearDown();
         ds.close();
         ds = null;
     }
 
+    public void testClose() throws Exception {
+        ds.setAccessToUnderlyingConnectionAllowed(true);
+
+        // active conneciton is held open when ds is closed
+        Connection activeConnection = getConnection();
+        Connection rawActiveConnection = ((DelegatingConnection) activeConnection).getInnermostDelegate();
+        assertFalse(activeConnection.isClosed());
+        assertFalse(rawActiveConnection.isClosed());
+
+        // idle connection is in pool but closed
+        Connection idleConnection = getConnection();
+        Connection rawIdleConnection = ((DelegatingConnection) idleConnection).getInnermostDelegate();
+        assertFalse(idleConnection.isClosed());
+        assertFalse(rawIdleConnection.isClosed());
+
+        // idle wrapper should be closed but raw conneciton should be open
+        idleConnection.close();
+        assertTrue(idleConnection.isClosed());
+        assertFalse(rawIdleConnection.isClosed());
+
+        ds.close();
+
+        // raw idle connection should now be closed
+        assertFalse(rawIdleConnection.isClosed());
+
+        // active connection should still be open
+        assertFalse(activeConnection.isClosed());
+        assertFalse(rawActiveConnection.isClosed());
+
+        // now close the active connection
+        activeConnection.close();
+
+        // both wrapper and raw active connection should be closed
+        assertTrue(activeConnection.isClosed());
+        assertTrue(rawActiveConnection.isClosed());
+    }
+
     public void testSetProperties() throws Exception {
         // normal
         ds.setConnectionProperties("name1=value1;name2=value2;name3=value3");
@@ -359,7 +400,7 @@
     public void testCreateDataSourceCleanupThreads() throws Exception {
         ds.close();
         ds = null;
-        ds = new BasicDataSource();
+        ds = createDataSource();
         ds.setDriverClassName("org.apache.commons.dbcp.TesterDriver");
         ds.setUrl("jdbc:apache:commons:testdriver");
         ds.setMaxActive(getMaxActive());

Added: jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/managed/TestBasicManagedDataSource.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/managed/TestBasicManagedDataSource.java?view=auto&rev=558884
==============================================================================
--- jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/managed/TestBasicManagedDataSource.java
(added)
+++ jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/managed/TestBasicManagedDataSource.java
Mon Jul 23 15:28:37 2007
@@ -0,0 +1,47 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.commons.dbcp.managed;
+
+import org.apache.commons.dbcp.BasicDataSource;
+import org.apache.commons.dbcp.TestBasicDataSource;
+import org.apache.geronimo.transaction.manager.TransactionManagerImpl;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * TestSuite for BasicManagedDataSource
+ */
+public class TestBasicManagedDataSource extends TestBasicDataSource {
+    public TestBasicManagedDataSource(String testName) {
+        super(testName);
+    }
+
+    public static Test suite() {
+        return new TestSuite(TestBasicManagedDataSource.class);
+    }
+
+    protected BasicDataSource createDataSource() throws Exception {
+        BasicManagedDataSource basicManagedDataSource = new BasicManagedDataSource();
+        basicManagedDataSource.setTransactionManager(new TransactionManagerImpl());
+        return basicManagedDataSource;
+    }
+
+    public void testHashCode() throws Exception {
+        // TODO reenable... hashcode doesn't work when accessToUnderlyingConnectionAllowed
is false
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message