diff --git a/src/main/java/com/zaxxer/hikari/HikariConfig.java b/src/main/java/com/zaxxer/hikari/HikariConfig.java index 030ac24e7..639140fce 100644 --- a/src/main/java/com/zaxxer/hikari/HikariConfig.java +++ b/src/main/java/com/zaxxer/hikari/HikariConfig.java @@ -83,6 +83,7 @@ public class HikariConfig implements HikariConfigMXBean private boolean isAutoCommit; private boolean isReadOnly; private boolean isInitializationFailFast; + private long initializationMaxAttempts; private boolean isIsolateInternalQueries; private boolean isRegisterMbeans; private boolean isAllowPoolSuspension; @@ -112,6 +113,7 @@ public HikariConfig() isAutoCommit = true; isInitializationFailFast = true; + initializationMaxAttempts = 1; String systemProp = System.getProperty("hikaricp.configurationFile"); if (systemProp != null) { @@ -415,6 +417,24 @@ public void setInitializationFailFast(boolean failFast) isInitializationFailFast = failFast; } + /** + * Get maximum number of connection attemts, that will be performed during startup. + * + * @return Number of attempts to get initail connection. + */ + public long getInitializationMaxAttempts() { + return initializationMaxAttempts; + } + + /** + * Set maximum number of connection attempts, that will be performed during startup. + * + * @param initializationMaxAttempts Maximum number of connection attempts during startup. + */ + public void setInitializationMaxAttempts(long initializationMaxAttempts) { + this.initializationMaxAttempts = initializationMaxAttempts; + } + public boolean isIsolateInternalQueries() { return isIsolateInternalQueries; diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 46a3f0b9b..ef913c7d3 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -508,13 +508,22 @@ private void abortActiveConnections(final ExecutorService assassinExecutor) private void checkFailFast() { if (config.isInitializationFailFast()) { - try (Connection connection = newConnection()) { - if (!connection.getAutoCommit()) { - connection.commit(); + for (int i = 0; i < config.getInitializationMaxAttempts(); i++) { + try (Connection connection = newConnection()) { + if (!connection.getAutoCommit()) { + connection.commit(); + } + return; + } + catch (Throwable e) { + if (i == config.getInitializationMaxAttempts() - 1) { + throw new PoolInitializationException(e); + } + else { + LOGGER.error("Error connecting during startup. Attempt #" + i); + quietlySleep(100L); + } } - } - catch (Throwable e) { - throw new PoolInitializationException(e); } } } @@ -665,5 +674,15 @@ public PoolInitializationException(Throwable t) { super("Failed to initialize pool: " + t.getMessage(), t); } + + /** + * Construct an exception, with a message. + * + * @param message Exceptiion message + */ + public PoolInitializationException(String message) + { + super(message); + } } }