Hi all

I out checked the database pool and I found a possible deadlock situation:
Say for example the maximum number of connections has been reached and a
request for a connection arrives.  It then goes into the following waiting
loop.

       while (true)
        {
            if (!pool.empty())
            {
                // .....  Validation checks done here & connection returned
.....
            }
            else
            {
                    connectionAttemptsCounter++;
            }
            wait();
        }

Now suppose while the thread is waiting, another thread returns a database
connection, to the release method:

        if ( isValid(connection) )
        {
            pool.push(connection);
            notify();
        }
        else
        {
            closeConnection(connection);
            totalConnections--;
        }

If this connection happen to be invalid the  notify() method is never
called, and the waiting thread will stay in a waiting state.  If we assume
that a lot of similar request will be executed we can assume that a lot of
the returned connections will be invalid - starving the waiting thread(s).

A possible solution could be:

RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/pool/Conne
ctionPool.java,v
retrieving revision 1.4
diff -r1.4 ConnectionPool.java
215c215,218
<                 connectionAttemptsCounter++;
---
>                 if (totalConnections<maxConnections)
>                     return getNewConnection(driver, url, username,
password);
>                 else
>                     connectionAttemptsCounter++;
295a299
>             notify();

~ Leon



------------------------------------------------------------
To subscribe:        [EMAIL PROTECTED]
To unsubscribe:      [EMAIL PROTECTED]
Problems?:           [EMAIL PROTECTED]

Reply via email to