in src/main/java/org/apache/commons/dbcp2/datasources/PerUserPoolDataSource.java [588:634]
protected PooledConnectionAndInfo getPooledConnectionAndInfo(final String userName, final String password) throws SQLException {
final PoolKey key = getPoolKey(userName);
ObjectPool<PooledConnectionAndInfo> pool;
PooledConnectionManager manager;
synchronized (this) {
manager = managers.get(key);
if (manager == null) {
try {
registerPool(userName, password);
manager = managers.get(key);
} catch (final NamingException e) {
throw new SQLException("RegisterPool failed", e);
}
}
pool = getCPDSConnectionFactoryPool(manager);
}
PooledConnectionAndInfo info = null;
try {
info = pool.borrowObject();
} catch (final NoSuchElementException ex) {
throw new SQLException("Could not retrieve connection info from pool", ex);
} catch (final Exception e) {
// See if failure is due to CPDSConnectionFactory authentication failure
try {
testCPDS(userName, password);
} catch (final Exception ex) {
throw new SQLException("Could not retrieve connection info from pool", ex);
}
// New password works, so kill the old pool, create a new one, and borrow
manager.closePool(userName);
synchronized (this) {
managers.remove(key);
}
try {
registerPool(userName, password);
pool = getPool(key);
} catch (final NamingException ne) {
throw new SQLException("RegisterPool failed", ne);
}
try {
info = pool.borrowObject();
} catch (final Exception ex) {
throw new SQLException("Could not retrieve connection info from pool", ex);
}
}
return info;
}