[ 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)