Tighten-up code.

pull/60/head
Brett Wooldridge 11 years ago
parent bcab411f4e
commit 5adebc96ea

@ -336,32 +336,22 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener
*/ */
private void addConnection() private void addConnection()
{ {
final int acquisitionTimeout = (int) configuration.getConnectionTimeout(); final int acquireTimeout = (int) configuration.getConnectionTimeout();
final int acquireRetries = configuration.getAcquireRetries(); final int acquireRetries = configuration.getAcquireRetries();
int loginTimeout = 2000; final int loginTimeout = Math.max((acquireRetries > 0 && acquireTimeout > 0) ? (acquireTimeout / (acquireRetries + 1)) : acquireTimeout, 50);
if (acquireRetries == 0)
{
loginTimeout = (acquisitionTimeout == 0 ? Integer.MAX_VALUE : acquisitionTimeout);
}
else if (acquisitionTimeout > 0)
{
loginTimeout = (acquisitionTimeout / (acquireRetries + 1));
}
long start = 0; for (int retries = 0; retries <= acquireRetries && !shutdown; retries++)
int retries = 0;
while (!shutdown)
{ {
long startMs = System.currentTimeMillis();
try try
{ {
// Speculative increment of totalConnections with expectation of success // Speculative increment of totalConnections with expectation of success (first time through)
if (retries == 0 && totalConnections.incrementAndGet() > configuration.getMaximumPoolSize()) if (retries == 0 && totalConnections.incrementAndGet() > configuration.getMaximumPoolSize())
{ {
totalConnections.decrementAndGet(); totalConnections.decrementAndGet();
break; break;
} }
start = System.currentTimeMillis();
dataSource.setLoginTimeout(loginTimeout); dataSource.setLoginTimeout(loginTimeout);
Connection connection = dataSource.getConnection(); Connection connection = dataSource.getConnection();
@ -377,39 +367,22 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener
IHikariConnectionProxy proxyConnection = ProxyFactory.getProxyConnection(this, connection, transactionIsolation, isAutoCommit, isReadOnly, catalog); IHikariConnectionProxy proxyConnection = ProxyFactory.getProxyConnection(this, connection, transactionIsolation, isAutoCommit, isReadOnly, catalog);
proxyConnection.resetConnectionState(); proxyConnection.resetConnectionState();
idleConnectionBag.add(proxyConnection); idleConnectionBag.add(proxyConnection);
break; return;
} }
catch (Exception e) catch (Exception e)
{ {
if (retries++ > acquireRetries) LOGGER.warn("Maximum connection creation retries exceeded: {}", e.getMessage(), (debug ? e : null));
{
if (debug)
{
LOGGER.error("Maximum connection creation retries exceeded: {}", e.getMessage(), e);
}
else
{
LOGGER.error("Maximum connection creation retries exceeded: {}", e.getMessage());
}
totalConnections.decrementAndGet();
break;
}
try long delay = loginTimeout - (System.currentTimeMillis() - startMs);
{ if (retries < acquireRetries && !sleepQuietly(delay))
long sleep = loginTimeout - (System.currentTimeMillis() - start);
if (sleep > 0)
{
Thread.sleep(sleep);
}
}
catch (InterruptedException e1)
{ {
totalConnections.decrementAndGet();
break; break;
} }
} }
} }
// We failed, so undo speculative increment of totalConnections
totalConnections.decrementAndGet();
} }
/** /**
@ -505,6 +478,22 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener
} }
} }
private boolean sleepQuietly(long delay)
{
try
{
if (delay > 0)
{
Thread.sleep(delay);
}
return true;
}
catch (InterruptedException e1)
{
return false;
}
}
private void logPoolState(String... prefix) private void logPoolState(String... prefix)
{ {
int total = totalConnections.get(); int total = totalConnections.get();

Loading…
Cancel
Save