Hi, A side question: Have you tried Apache Commons DBCP (which is based on Commons Pool)?
https://commons.apache.org/proper/commons-dbcp/ Gary On Fri, Sep 7, 2018 at 5:24 PM Bruce Milner <bruce.mil...@emberex.com> wrote: > Hello, > > I am using commons-pool2-2.5.0 for a MySQL connection pooler. The reason > for not using out-of-the-box is that the existing code relies on > changing catalogs at runtime reusing an existing connection. The > original design was to use multiple databases using the same connection > and this cannot be changed. > > I recently replaced a lot of hand crafted code with the commons-pool2 > implementation. > > The issue I have is that one server I manage went into a state where > there are plenty of connections, but none are being returned to the > pool. They are all stuck on a lock inside of > GenericKeyedObjectPool.returnObject. > > The config is basically > GenericKeyedObjectPoolConfig config = new > GenericKeyedObjectPoolConfig(); > config.setBlockWhenExhausted(true); > config.setMaxTotal(120); > config.setMaxTotalPerKey(60); > config.setTestOnBorrow(true); > config.setTimeBetweenEvictionRunsMillis(60000); > config.setMinEvictableIdleTimeMillis(0); // don't starve > connections because of catalog switches. > /** > * For database connections, use FIFO so that we get rid of > older connections first before newer ones. > */ > config.setLifo(false); > return new GenericKeyedObjectPool<String, PooledConnection>(new > PooledConnectionFactory(), config); > > There are 150 of these threads waiting on a lock to release connections > java.lang.Thread.State: WAITING (parking) > at sun.misc.Unsafe.park(Native Method) > - parking to wait for <0x00000006471cd7d8> (a > java.util.concurrent.locks.ReentrantLock$NonfairSync) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) > at > > java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) > at > > java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870) > at > > java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199) > at > > java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209) > at > java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285) > at > > org.apache.commons.pool2.impl.LinkedBlockingDeque.hasTakeWaiters(LinkedBlockingDeque.java:1389) > at > > org.apache.commons.pool2.impl.GenericKeyedObjectPool.hasBorrowWaiters(GenericKeyedObjectPool.java:849) > at > > org.apache.commons.pool2.impl.GenericKeyedObjectPool.returnObject(GenericKeyedObjectPool.java:551) > at > > com.ilrn.util.sql.connectionpooler.ConnectionPooler.releaseConnection(ConnectionPooler.java:358) > at > > com.ilrn.util.sql.connectionpooler.PooledConnection.close(PooledConnection.java:141) > at > > com.ilrn.util.sql.connectionpooler.ConnectionPooler.safeClose(ConnectionPooler.java:480) > > and 158 of these threads waiting to open connections. > java.lang.Thread.State: WAITING (parking) > at sun.misc.Unsafe.park(Native Method) > - parking to wait for <0x00000006471cd7d8> (a > java.util.concurrent.locks.ReentrantLock$NonfairSync) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) > at > > java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) > at > > java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870) > at > > java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199) > at > > java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209) > at > java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285) > at > > org.apache.commons.pool2.impl.LinkedBlockingDeque.pollFirst(LinkedBlockingDeque.java:560) > at > > org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:356) > at > > org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:281) > at > > com.ilrn.util.sql.connectionpooler.ConnectionPooler.getConnection(ConnectionPooler.java:197) > at com.ilrn.util.sql.Database.getConnection(Database.java:1273) > > For the "- parking to wait for <0x00000006471cd7d8> (a > java.util.concurrent.locks.ReentrantLock$NonfairSync)" there are 155. > Though I see no other messages with that object in the thread dump. > > Has anyone run into this? It seems like some sort of deadlock. > > -- > Bruce Milner > Senior Software Developer (Emberex) > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@commons.apache.org > For additional commands, e-mail: user-h...@commons.apache.org > >