From 2c27a23d9ffd5f820dd3d2ad89f6cfc2954eb74f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20Nyg=C3=A5rd?= Date: Fri, 25 Nov 2016 21:56:19 +0100 Subject: [PATCH] Added parameter initalizationMaxAttempts which controls number of attempts to connect to the database. See issue 770: https://github.com/brettwooldridge/HikariCP/issues/770 --- .../java/com/zaxxer/hikari/HikariConfig.java | 20 ++++++++++++ .../com/zaxxer/hikari/pool/HikariPool.java | 31 +++++++++++++++---- 2 files changed, 45 insertions(+), 6 deletions(-) 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); + } } }