Details
-
Bug
-
Status: Resolved
-
Minor
-
Resolution: Fixed
-
2.1.1
-
None
Description
If while PoolingDataSource.getConnection() is waiting for an available connection, Thread.interrupt() is called against the current thread, an java.lang.InterruptedException is caught internally but not reset.
It is however thrown out wrapped in an java.sql.SQLException.
A stack trace of such an occurrence is as follows:
java.sql.SQLException: Cannot get a connection, general error at org.apache.commons.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:146) at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1533) Caused by: java.lang.InterruptedException at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1220) at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335) at org.apache.commons.pool2.impl.LinkedBlockingDeque.pollFirst(LinkedBlockingDeque.java:624) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:444) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) at org.apache.commons.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:134) ... 8 more
Since the interrupt status flag is not reset, it is left to the caller to look out for it and perform the interrupt specific logic, or reset the flag. i.e.
try { ds.getConnection() } catch (SQLException e) { if (e.getCause() instanceof InterruptedException) { Thread.current.interrupted(); } ... }