Fixes #770 by adding a new property initializationFailTimeout and deprecating

initializationFailFast.  Exception path still needs some work… coming in the
next commit.
pull/772/head
Brett Wooldridge 8 years ago
parent fe4f68a05a
commit e3b79ee044

@ -69,6 +69,7 @@ public class HikariConfig implements HikariConfigMXBean
// Properties NOT changeable at runtime // Properties NOT changeable at runtime
// //
private long initializationFailTimeout;
private String catalog; private String catalog;
private String connectionInitSql; private String connectionInitSql;
private String connectionTestQuery; private String connectionTestQuery;
@ -393,12 +394,42 @@ public class HikariConfig implements HikariConfigMXBean
this.isAllowPoolSuspension = isAllowPoolSuspension; this.isAllowPoolSuspension = isAllowPoolSuspension;
} }
/**
* Get the pool initialization failure timeout.
*
* @return the number of milliseconds before the pool initialization fails
*/
public long getInitializationFailTimeout()
{
return initializationFailTimeout;
}
/**
* Set the pool initialization failure timeout. A value of 0 (default) fails immediately.
* The minimum value is 1000ms (1 second).
*
* @param initializationFailTimeout the number of milliseconds before the
* pool initialization fails
*/
public void setInitializationFailTimeout(long initializationFailTimeout)
{
if (initializationFailTimeout < 0L) {
initializationFailTimeout = 0L;
}
else if (initializationFailTimeout < 1000L) {
initializationFailTimeout = 1000L;
}
this.initializationFailTimeout = initializationFailTimeout;
}
/** /**
* Get whether or not the construction of the pool should throw an exception * Get whether or not the construction of the pool should throw an exception
* if the minimum number of connections cannot be created. * if the minimum number of connections cannot be created.
* *
* @return whether or not initialization should fail on error immediately * @return whether or not initialization should fail on error immediately
*/ */
@Deprecated
public boolean isInitializationFailFast() public boolean isInitializationFailFast()
{ {
return isInitializationFailFast; return isInitializationFailFast;
@ -410,9 +441,14 @@ public class HikariConfig implements HikariConfigMXBean
* *
* @param failFast true if the pool should fail if the minimum connections cannot be created * @param failFast true if the pool should fail if the minimum connections cannot be created
*/ */
@Deprecated
public void setInitializationFailFast(boolean failFast) public void setInitializationFailFast(boolean failFast)
{ {
isInitializationFailFast = failFast; isInitializationFailFast = failFast;
LOGGER.warn("The initializationFailFast propery is deprecated, see initializationFailTimeout");
if (!failFast) {
initializationFailTimeout = Long.MAX_VALUE;
}
} }
public boolean isIsolateInternalQueries() public boolean isIsolateInternalQueries()

@ -27,6 +27,7 @@ import static java.util.concurrent.TimeUnit.SECONDS;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.SQLTimeoutException;
import java.sql.SQLTransientConnectionException; import java.sql.SQLTransientConnectionException;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
@ -507,16 +508,28 @@ public class HikariPool extends PoolBase implements HikariPoolMXBean, IBagStateL
*/ */
private void checkFailFast() private void checkFailFast()
{ {
if (config.isInitializationFailFast()) { if (config.getInitializationFailTimeout() == 0) {
return;
}
final long startTime = clockSource.currentTime();
boolean acquired = false;
Throwable throwable = new SQLTimeoutException("HikariCP was unable to initialize connections in pool " + poolName);
do {
try (Connection connection = newConnection()) { try (Connection connection = newConnection()) {
acquired = true;
if (!connection.getAutoCommit()) { if (!connection.getAutoCommit()) {
connection.commit(); connection.commit();
} }
return;
} }
catch (Throwable e) { catch (Throwable t) {
throw new PoolInitializationException(e); throwable = t;
} quietlySleep(1000L);
} }
} while (!acquired && clockSource.elapsedMillis(startTime) < config.getInitializationFailTimeout());
throw new PoolInitializationException(throwable);
} }
private void softEvictConnection(final PoolEntry poolEntry, final String reason, final boolean owner) private void softEvictConnection(final PoolEntry poolEntry, final String reason, final boolean owner)

@ -500,7 +500,7 @@ public class TestConnections
config.setMaximumPoolSize(2); config.setMaximumPoolSize(2);
config.setConnectionTimeout(TimeUnit.SECONDS.toMillis(3)); config.setConnectionTimeout(TimeUnit.SECONDS.toMillis(3));
config.setConnectionTestQuery("VALUES 1"); config.setConnectionTestQuery("VALUES 1");
config.setInitializationFailFast(false); config.setInitializationFailTimeout(TimeUnit.SECONDS.toMillis(2));
config.setDataSource(stubDataSource); config.setDataSource(stubDataSource);
try (HikariDataSource ds = new HikariDataSource(config); Connection c = ds.getConnection()) { try (HikariDataSource ds = new HikariDataSource(config); Connection c = ds.getConnection()) {

Loading…
Cancel
Save