[
https://issues.apache.org/jira/browse/POOL-185?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13022603#comment-13022603
]
Phil Steitz commented on POOL-185:
----------------------------------
When you kill all the connections on the server side, how many are checked out
by clients?
If the answer == maxActive, then this is not a bug, but pool and dbcp working
as designed. The pool contract is that no more than maxActive instances will
be in circulation (either idle in the pool or checked out to clients) at a
given time. When you kill the connections, the pool has no direct way of
learning about this. You need to close the connections to make the instance
count available. If the driver reports isClosed() correctly, DBCP will
invalidate the bad instances as you close the connection handles. If this is a
regular occurrence, it is best to set testOnBorrow and/or textOnReturn to true
to ensure bad connections do not get handed back to clients.
The evict() code mentioned is irrelevant. ensureMinIdle is called directly by
the run method of the Evictor.
Unless I am misunderstanding something, this looks like a question for the user
list, not a pool or dbcp bug.
> when continue kill all connection , Cannot get a connection.
> -------------------------------------------------------------
>
> Key: POOL-185
> URL: https://issues.apache.org/jira/browse/POOL-185
> Project: Commons Pool
> Issue Type: Bug
> Affects Versions: 1.5.5
> Environment: suse enterprise linux 11 (64 bit)
> jdk1.5.0_21 (32 bit)
> oracle 10.2.0.3(64 bit)
> commons-pool-1.5.5.jar
> commons-dbcp-1.3.jar
> configure
> <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
> <property name="url"
> value="jdbc:oracle:thin:@10.70.193.1:1521:ora10g"/>
> <property name="username" value="yh"/>
> <property name="password" value="yh"/>
> <property name="initialSize" value="9"/>
> <property name="maxActive" value="18"/>
> <property name="maxIdle" value="6"/>
> <property name="minIdle" value="2"/>
> <property name="maxWait" value="2000"/>
> <property name="validationQuery" value="select 1 from dual"/>
> <property name="testWhileIdle" value="true"/>
> <property name="testOnBorrow" value="false"/>
> <property name="testOnReturn" value="false"/>
> <property name="timeBetweenEvictionRunsMillis" value="3000"/>
> <property name="numTestsPerEvictionRun" value="2"/>
> Reporter: cauherk
>
> After program startup,continue kill all connection.Use oracle command "alter
> system kill session 'sid,#p'".
> Exception
> org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool
> error Timeout waiting for idle object
> at
> org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114)
> at
> org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
> at test.TestConn.aa(TestConn.java:18)
> at test.TestConn.main(TestConn.java:49)
> Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
> at
> org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1144)
> at
> org.apache.commons.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:79)
> at
> org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
> ... 7 more
> java.sql.SQLException: Cannot get a connection, pool error Timeout waiting
> for idle object
> at test.TestConn.aa(TestConn.java:18)
> at test.TestConn.main(TestConn.java:49)
> I debug org.apache.commons.pool.impl.GenericObjectPool.
> public synchronized void evict() throws Exception {
> assertOpen();
> if(!_pool.isEmpty()) {
> ...
> } // if !empty
> }
>
> but _pool.isEmpty() is always empty,can not run into.
> private synchronized int calculateDeficit(boolean incrementInternal) {
> int objectDeficit = getMinIdle() - getNumIdle();
> if (_maxActive > 0) {
> int growLimit = Math.max(0,
> getMaxActive() - getNumActive() - getNumIdle() -
> _numInternalProcessing);
> objectDeficit = Math.min(objectDeficit, growLimit);
> }
> if (incrementInternal && objectDeficit >0) {
> _numInternalProcessing++;
> }
> return objectDeficit;
> }
>
> calculateDeficit method is always return 0.
> So program always throw exception.
>
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira