[ 
https://issues.apache.org/jira/browse/DBCP-331?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Phil Steitz updated DBCP-331:
-----------------------------

    Comment: was deleted

(was: I am feeling stupid now for having moved this to DBCP.  While there may 
be DBCP issues exposed here as well, I concur with Gabor's analysis that GOP, 
GKOP can fail as follows:

Thread 1:  enters borrowObject, creates a latch and puts it into the allocation 
queue
Thread 1:  allocate() does not serve the latch, but does set mayCreate() to true
Thread 1:  creates a good new instance, "goodGuy" and assigns it to its latch
Thread 1:  enters validateObject
Thread 2:  returns an invalid instance, "badGuy"
Thread 2:  allocate() serves Thread1's latch with "badGuy"
Thread 1:  finishes validateObject successfully, but its latch now carries 
"badGuy" which is returned to the client

Note that this also effectively leaks "goodGuy."

I don't have a test case to demonstrate this yet and I can't fully explain the 
stack trace without assuming something else awry in the DBCP code, so the above 
may be flawed, but it looks to me like this is a pool bug. 

IIUC what is going on, it is probably best to rely on the latch's monitor in 
the fix, "closing" it when it is being served in borrowObject and removing but 
ignoring it in allocate if it is closed. 

Gabor:  can you post some more info on the DBCP config - in particular, is 
testOnReturn false,  how are maxIdle, minIdle set, is the evictor enabled, and 
are you using DriverAdaptorCPDS (looks like yes)?  Thanks!)

> SharedPoolDataSource does not handle null keys correctly
> --------------------------------------------------------
>
>                 Key: DBCP-331
>                 URL: https://issues.apache.org/jira/browse/DBCP-331
>             Project: Commons Dbcp
>          Issue Type: Bug
>    Affects Versions: 1.3, 1.4
>         Environment: Windows, java version "1.6.0_06", Torque 3.3 (DBCP 1.4, 
> jTDS 1.2.5)
>            Reporter: Gabor Horvath
>         Attachments: GenericKeyedObjectPool.java
>
>
> GenericKeyedObjectPool.borrowObject does not invalidate object if 
> validateObject fails (line ~1200). I guess invalidation would be needed for 
> objects which are not newly created (newlyCreated flag in the code).
> Scenario:
> 1.) DB connection put into pool
> 2.) Attempt to reuse connection (borrowObject)
> 3.) Test on borrow (executing simple SQL query) fails: DB connection closed 
> on jTDS level but connection remains in the pool
> 4.) Subsequent attempts to reuse the connection causes 
> "java.sql.SQLException: Invalid state, the Connection object is closed"

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to