From 94749ff456c475c76292a07856ce9056ee78f01e Mon Sep 17 00:00:00 2001 From: Tom Reay Date: Tue, 29 Aug 2017 08:42:14 +0100 Subject: [PATCH] Allow data source to be reinitialized at runtime --- .../java/com/zaxxer/hikari/HikariPoolMXBean.java | 2 ++ .../java/com/zaxxer/hikari/pool/HikariPool.java | 5 +++++ src/main/java/com/zaxxer/hikari/pool/PoolBase.java | 13 +++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/HikariPoolMXBean.java b/src/main/java/com/zaxxer/hikari/HikariPoolMXBean.java index 22c3dbc0..adc9e68f 100644 --- a/src/main/java/com/zaxxer/hikari/HikariPoolMXBean.java +++ b/src/main/java/com/zaxxer/hikari/HikariPoolMXBean.java @@ -33,6 +33,8 @@ public interface HikariPoolMXBean void softEvictConnections(); + void reinitializeDataSource(); + void suspendPool(); void resumePool(); diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 7f98380e..4b9d4d59 100755 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -350,6 +350,11 @@ public final class HikariPool extends PoolBase implements HikariPoolMXBean, IBag connectionBag.values().forEach(poolEntry -> softEvictConnection(poolEntry, "(connection evicted)", false /* not owner */)); } + @Override + public void reinitializeDataSource() { + initializeDataSource(); + } + /** {@inheritDoc} */ @Override public synchronized void suspendPool() diff --git a/src/main/java/com/zaxxer/hikari/pool/PoolBase.java b/src/main/java/com/zaxxer/hikari/pool/PoolBase.java index 9063d817..e69509d2 100755 --- a/src/main/java/com/zaxxer/hikari/pool/PoolBase.java +++ b/src/main/java/com/zaxxer/hikari/pool/PoolBase.java @@ -81,7 +81,7 @@ abstract class PoolBase private int defaultTransactionIsolation; private int transactionIsolation; private Executor netTimeoutExecutor; - private DataSource dataSource; + private AtomicReference dataSource; private final String catalog; private final String schema; @@ -114,6 +114,7 @@ abstract class PoolBase this.connectionTimeout = config.getConnectionTimeout(); this.validationTimeout = config.getValidationTimeout(); this.lastConnectionFailure = new AtomicReference<>(); + this.dataSource = new AtomicReference<>(); initializeDataSource(); } @@ -193,7 +194,7 @@ abstract class PoolBase public DataSource getUnwrappedDataSource() { - return dataSource; + return dataSource.get(); } // *********************************************************************** @@ -254,7 +255,7 @@ abstract class PoolBase long getLoginTimeout() { try { - return (dataSource != null) ? dataSource.getLoginTimeout() : SECONDS.toSeconds(5); + return (dataSource != null) ? dataSource.get().getLoginTimeout() : SECONDS.toSeconds(5); } catch (SQLException e) { return SECONDS.toSeconds(5); } @@ -324,7 +325,7 @@ abstract class PoolBase /** * Create/initialize the underlying DataSource. */ - private void initializeDataSource() + void initializeDataSource() { final String jdbcUrl = config.getJdbcUrl(); final String username = config.getUsername(); @@ -356,7 +357,7 @@ abstract class PoolBase createNetworkTimeoutExecutor(dataSource, dsClassName, jdbcUrl); } - this.dataSource = dataSource; + this.dataSource.set(dataSource); } /** @@ -373,7 +374,7 @@ abstract class PoolBase String username = config.getUsername(); String password = config.getPassword(); - connection = (username == null) ? dataSource.getConnection() : dataSource.getConnection(username, password); + connection = (username == null) ? dataSource.get().getConnection() : dataSource.get().getConnection(username, password); if (connection == null) { throw new SQLTransientConnectionException("DataSource returned null unexpectedly"); }