You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by "Phil Steitz (JIRA)" <ji...@apache.org> on 2006/07/10 07:18:33 UTC

[jira] Updated: (DBCP-134) [dbcp] DelegatingConnection.close() throws exception

     [ http://issues.apache.org/jira/browse/DBCP-134?page=all ]

Phil Steitz updated DBCP-134:
-----------------------------

    Bugzilla Id:   (was: 33945)
    Fix Version: 1.3

> [dbcp] DelegatingConnection.close() throws exception
> ----------------------------------------------------
>
>          Key: DBCP-134
>          URL: http://issues.apache.org/jira/browse/DBCP-134
>      Project: Commons Dbcp
>         Type: Bug

>     Versions: Nightly Builds
>  Environment: Operating System: Mac OS X 10.3
> Platform: Macintosh
>     Reporter: Hilmar Lapp
>     Priority: Critical
>      Fix For: 1.3

>
> Closing connections that were obtained from PoolingDataSource und wrapped with a 
> DelegatingConnection throws a 'java.sql.SQLException: Already closed' when calling close() on them in 
> order to return the connection to the underlying pool.
> The reason is code in DelegatingConnection.passivate() the motivation for which I don't completely 
> understand.
> At any rate, here is what happens. DelegatingConnection.close() calls passivate() before actually closing 
> the delegate: 
>     /**
>      * Closes the underlying connection, and close
>      * any Statements that were not explicitly closed.
>      */
>     public void close() throws SQLException
>     {
>         passivate();
>         _conn.close();
>     }
> DelegatingConnection.passivate() in turn cleans up statements and, if the delegate is a 
> DelegatingConnection too, calls passivate() on the delegate. Finally, the instance variable _closed is set 
> to true:
>     protected void passivate() throws SQLException {
>         try {
>             // ... some statement clean up work, then: 
>             if(_conn instanceof DelegatingConnection) {
>                 ((DelegatingConnection)_conn).passivate();
>             }
>         }
>         finally {
>             _closed = true;
>         }
>     }
> When this finishes and the delegate is indeed itself a delegating connection, close() will call 
> _conn.close(). If DelegatingConnection were final this would even work, but it is not (on purpose). A 
> notable derived class is PoolableConnection, which overrides close() and throws an exception if it is 
> called when isClosed() returns true. isClosed() returns true if the _closed instance variable is true. 
> BUMMER.
> The problem surfaces as soon as one tries to wrap the connection returned by PoolingDataSource with 
> another DelegatingConnections, which happens to be what I do.
> I noticed this when I upgraded from 1.1 to 1.2.1, and it's still there in the nightly snapshot.
> There are several design decisions that I think deserve a critical look:
>     - why does passivate() set a variable that effectively decides whether a connection is considered 
> closed or not? shouldn't only close() be doing that?
>  
>     - why does DelegatingConnection even bother to clean up statements when those statements by 
> definition must have come from the delegate (or its delegate and so forth) and so are the responsibility 
> of the delegate (creator) to clean up
>     - by propagating passivate() in the same method to the delegate if the delegate delegates itself 
> DelegatingConnection is making assumptions that may be (and in fact are) easily violated if someone 
> sub-classes DelegatingConnection and the delegate is now a subclass with possibly altered behavior. 
> Why does it not suffice to expect that calling close() on the delegate will give the delegate enough 
> chance to clean up itself, regardless of the implementing class of the delegate.
> I'd be thrilled if this can be fixed quickly, and fixing any of the problems pinpointed above will fix the 
> issue. Or so I think.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


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