[ 
https://issues.apache.org/jira/browse/DBCP-513?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16660545#comment-16660545
 ] 

Mark Struberg commented on DBCP-513:
------------------------------------

What appears to me as a _potential_ issue is that if the idletime is rather 
short we might end up with a glitch due to the following code:

Imagine that our 80 threads all try to borrow a Connection but we have a 
maxActive of say 10. So 70 are waiting. 
They are basically locked in exactly the place above. They are waiting for 
someone to return a Connection (or any other kind of pooled object for that 
matter) into the LikedDequeue.

But here is a funny code which destroys a Connection _without_ returning them 
to the DeQueue if the idle time is exceeded!
https://github.com/apache/commons-pool/blob/commons-pool-2.6.0/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java#L582
{noformat}
        if (isClosed() || maxIdleSave > -1 && maxIdleSave <= 
idleObjects.size()) {
            try {
                destroy(p);
...
        } else {
            if (getLifo()) {
                idleObjects.addFirst(p);
            } else {
                idleObjects.addLast(p);
            }
{noformat}

So in this case nobody is returning something to the DeQueue and thus those 
connections are probably waiting forever :(

A possible solution would (probably?) be to remove the else and execute it 
always. And have the destroy(p); immediately calla p = create(); ?
How does that sound?

> Hundreads of threads in Wait state with below stack trace
> ---------------------------------------------------------
>
>                 Key: DBCP-513
>                 URL: https://issues.apache.org/jira/browse/DBCP-513
>             Project: Commons DBCP
>          Issue Type: Bug
>    Affects Versions: 2.1.1
>         Environment: Java Version: 
> 1.8.0_121
>  OS Complete Version: 
> Linux sdpvvrwm556 3.10.0-693.11.6.el7.x86_64 #1 SMP Thu Dec 28 14:23:39 EST 
> 2017 x86_64 x86_64 x86_64 GNU/Linux
>  
> DBCP Jar:
> commons-dbcp2-2.1.1.jar
>            Reporter: Mahesh
>            Priority: Blocker
>         Attachments: Screen Shot 2018-08-05 at 10.29.52 AM.png, 
> dbcp_lock_1.txt, dbcp_lock_7.txt, dbcpthread.zip
>
>
> Hello Team,
> Our application suddenly stops responding, when we checked thread dump, most 
> of the threads are in wait state with below stack trace, we had to restart 
> server to make it active, can you pelase provide your inputs on the root 
> cause & resolution?
>  
> "JSockConn Thread #4532" #40906 prio=5 os_prio=0 tid=0x00007f84382ce800 
> nid=0xc692 waiting on condition [0x00007f83d38f8000]
>  java.lang.Thread.State: WAITING (parking)
>  at sun.misc.Unsafe.park(Native Method)
>  - parking to wait for <0x00000005c30a11b8> (a 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
>  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
>  at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
>  at 
> org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:583)
>  at 
> org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442)
>  at 
> org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
>  at 
> org.apache.commons.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:134)
>  at 
> org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1533)



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to