commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Atsushi Nakagawa (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (DBCP-459) InterruptedException consumed and not reset by PoolingDataSource.getConnection()
Date Mon, 11 Apr 2016 04:09:25 GMT

     [ https://issues.apache.org/jira/browse/DBCP-459?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Atsushi Nakagawa updated DBCP-459:
----------------------------------
    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:

{noformat}
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
{noformat}

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.

{code:java}
try {
    ds.getConnection()
} catch (SQLException e) {
    if (e.getCause() instanceof InterruptedException) {
        Thread.current.interrupted();
    }
    ...
}
{code}


  was:
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:

{noformat}
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
{noformat}

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.

{code:java}
try {
    ds.getConnection()
} catch (SQLException e) {
    if (e.getCause() instanceof InterruptedException) {
        Thread.current.interrupted();
    }
}
{code}



> InterruptedException consumed and not reset by PoolingDataSource.getConnection()
> --------------------------------------------------------------------------------
>
>                 Key: DBCP-459
>                 URL: https://issues.apache.org/jira/browse/DBCP-459
>             Project: Commons Dbcp
>          Issue Type: Bug
>    Affects Versions: 2.1.1
>            Reporter: Atsushi Nakagawa
>            Priority: Minor
>
> 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:
> {noformat}
> 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
> {noformat}
> 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.
> {code:java}
> try {
>     ds.getConnection()
> } catch (SQLException e) {
>     if (e.getCause() instanceof InterruptedException) {
>         Thread.current.interrupted();
>     }
>     ...
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message