Return-Path: Delivered-To: apmail-jakarta-commons-dev-archive@www.apache.org Received: (qmail 96986 invoked from network); 18 Jul 2007 06:46:55 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 18 Jul 2007 06:46:55 -0000 Received: (qmail 59813 invoked by uid 500); 18 Jul 2007 06:46:45 -0000 Delivered-To: apmail-jakarta-commons-dev-archive@jakarta.apache.org Received: (qmail 59741 invoked by uid 500); 18 Jul 2007 06:46:45 -0000 Mailing-List: contact commons-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Help: List-Post: List-Id: "Jakarta Commons Developers List" Reply-To: "Jakarta Commons Developers List" Delivered-To: mailing list commons-dev@jakarta.apache.org Received: (qmail 59730 invoked by uid 500); 18 Jul 2007 06:46:45 -0000 Received: (qmail 59727 invoked by uid 99); 18 Jul 2007 06:46:45 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 17 Jul 2007 23:46:45 -0700 X-ASF-Spam-Status: No, hits=-99.5 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 17 Jul 2007 23:46:41 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 9223A1A981A; Tue, 17 Jul 2007 23:46:21 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r557176 - in /jakarta/commons/proper/dbcp/trunk: src/java/org/apache/commons/dbcp/ src/java/org/apache/commons/dbcp/cpdsadapter/ src/test/org/apache/commons/dbcp/ src/test/org/apache/commons/dbcp/managed/ xdocs/ Date: Wed, 18 Jul 2007 06:46:20 -0000 To: commons-cvs@jakarta.apache.org From: psteitz@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070718064621.9223A1A981A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: psteitz Date: Tue Jul 17 23:46:16 2007 New Revision: 557176 URL: http://svn.apache.org/viewvc?view=rev&rev=557176 Log: Changed behavior to allow Connection, Statement, PreparedStatement, CallableStatement and ResultSet to be closed multiple times. The first time close is called the resource is closed and any subsequent calls have no effect. This behavior is required as per the JavaDocs for these classes. Also added tests for closing all types multiple times and updated any tests that incorrectly assert that a resource can not be closed more then once. JIRA: DBCP-233 Patch provided by Dain Sundstrom Fixes DBCP-134, DBCP-3 Modified: jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolablePreparedStatement.java jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolingDataSource.java jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolingDriver.java jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/cpdsadapter/ConnectionImpl.java jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestConnectionPool.java jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestManual.java jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TesterResultSet.java jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TesterStatement.java jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/managed/TestManagedDataSource.java jakarta/commons/proper/dbcp/trunk/xdocs/changes.xml Modified: jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java?view=diff&rev=557176&r1=557175&r2=557176 ============================================================================== --- jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java (original) +++ jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java Tue Jul 17 23:46:16 2007 @@ -208,10 +208,17 @@ * Closes the underlying connection, and close * any Statements that were not explicitly closed. */ - public void close() throws SQLException - { - passivate(); - _conn.close(); + 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()) { + try { + _conn.close(); + } finally { + _closed = true; + } + } } protected void handleException(SQLException e) throws SQLException { Modified: jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolablePreparedStatement.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolablePreparedStatement.java?view=diff&rev=557176&r1=557175&r2=557176 ============================================================================== --- jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolablePreparedStatement.java (original) +++ jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolablePreparedStatement.java Tue Jul 17 23:46:16 2007 @@ -72,9 +72,8 @@ * Return me to my pool. */ public void close() throws SQLException { - if(isClosed()) { - throw new SQLException("Already closed"); - } else { + // calling close twice should have no effect + if (!isClosed()) { try { _pool.returnObject(_key,this); } catch(SQLException e) { Modified: jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolingDataSource.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolingDataSource.java?view=diff&rev=557176&r1=557175&r2=557176 ============================================================================== --- jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolingDataSource.java (original) +++ jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolingDataSource.java Tue Jul 17 23:46:16 2007 @@ -177,10 +177,11 @@ } public void close() throws SQLException { - checkOpen(); - this.delegate.close(); - this.delegate = null; - super.setDelegate(null); + if (delegate != null) { + this.delegate.close(); + this.delegate = null; + super.setDelegate(null); + } } public boolean isClosed() throws SQLException { Modified: jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolingDriver.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolingDriver.java?view=diff&rev=557176&r1=557175&r2=557176 ============================================================================== --- jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolingDriver.java (original) +++ jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/PoolingDriver.java Tue Jul 17 23:46:16 2007 @@ -263,12 +263,13 @@ throw new SQLException("Connection is closed."); } } - + public void close() throws SQLException { - checkOpen(); - this.delegate.close(); - this.delegate = null; - super.setDelegate(null); + if (delegate != null) { + this.delegate.close(); + this.delegate = null; + super.setDelegate(null); + } } public boolean isClosed() throws SQLException { Modified: jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/cpdsadapter/ConnectionImpl.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/cpdsadapter/ConnectionImpl.java?view=diff&rev=557176&r1=557175&r2=557176 ============================================================================== --- jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/cpdsadapter/ConnectionImpl.java (original) +++ jakarta/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/cpdsadapter/ConnectionImpl.java Tue Jul 17 23:46:16 2007 @@ -113,9 +113,10 @@ * @exception SQLException The database connection couldn't be closed. */ public void close() throws SQLException { - assertOpen(); - isClosed = true; - pooledConnection.notifyListeners(); + if (!isClosed) { + isClosed = true; + pooledConnection.notifyListeners(); + } } /** Modified: jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestConnectionPool.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestConnectionPool.java?view=diff&rev=557176&r1=557175&r2=557176 ============================================================================== --- jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestConnectionPool.java (original) +++ jakarta/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/TestConnectionPool.java Tue Jul 17 23:46:16 2007 @@ -148,37 +148,92 @@ } } - public void testCantCloseConnectionTwice() throws Exception { - for(int i=0;i + + Changed behavior to allow Connection, Statement, PreparedStatement, + CallableStatement and ResultSet to be closed multiple times. The first + time close is called the resource is closed and any subsequent calls + have no effect. This behavior is required as per the JavaDocs for these + classes. Also added tests for closing all types multiple times and + updated any tests that incorrectly assert that a resource can not be + closed more then once. Fixes DBCP-134 and DBCP-3. +