Author: markt Date: Sun Jun 21 16:27:18 2009 New Revision: 787048 URL: http://svn.apache.org/viewvc?rev=787048&view=rev Log: Fix DBCP-291. Narrow sync so we don't call borrowObject() inside the sync. If pool is exhausted and N threads request objects the requests will time out at maxWait, 2*maxWait, 3*maxWait, ..., n*maxWait rather than all timing out at maxWait.
Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/datasources/PerUserPoolDataSource.java commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/datasources/SharedPoolDataSource.java Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/datasources/PerUserPoolDataSource.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/datasources/PerUserPoolDataSource.java?rev=787048&r1=787047&r2=787048&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/datasources/PerUserPoolDataSource.java (original) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/datasources/PerUserPoolDataSource.java Sun Jun 21 16:27:18 2009 @@ -356,18 +356,20 @@ // ---------------------------------------------------------------------- // Inherited abstract methods - protected synchronized PooledConnectionAndInfo + protected PooledConnectionAndInfo getPooledConnectionAndInfo(String username, String password) throws SQLException { PoolKey key = getPoolKey(username); Object pool = pools.get(key); - if (pool == null) { - try { - registerPool(username, password); - pool = pools.get(key); - } catch (NamingException e) { - throw new SQLNestedException("RegisterPool failed", e); + synchronized(this) { + if (pool == null) { + try { + registerPool(username, password); + pool = pools.get(key); + } catch (NamingException e) { + throw new SQLNestedException("RegisterPool failed", e); + } } } Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/datasources/SharedPoolDataSource.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/datasources/SharedPoolDataSource.java?rev=787048&r1=787047&r2=787048&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/datasources/SharedPoolDataSource.java (original) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/datasources/SharedPoolDataSource.java Sun Jun 21 16:27:18 2009 @@ -151,14 +151,17 @@ // ---------------------------------------------------------------------- // Inherited abstract methods - protected synchronized PooledConnectionAndInfo + protected PooledConnectionAndInfo getPooledConnectionAndInfo(String username, String password) throws SQLException { - if (pool == null) { - try { - registerPool(username, password); - } catch (NamingException e) { - throw new SQLNestedException("RegisterPool failed", e); + + synchronized(this) { + if (pool == null) { + try { + registerPool(username, password); + } catch (NamingException e) { + throw new SQLNestedException("RegisterPool failed", e); + } } }