Use native way for connection pool init timeout

This commit is contained in:
P0nk
2021-04-02 20:16:57 +02:00
parent 08a0407417
commit 8b7e989fed

View File

@@ -1,9 +1,10 @@
package tools; package tools;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.util.concurrent.TimeUnit;
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
@@ -33,6 +34,8 @@ public class DatabaseConnection {
config.setUsername(YamlConfig.config.server.DB_USER); config.setUsername(YamlConfig.config.server.DB_USER);
config.setPassword(YamlConfig.config.server.DB_PASS); config.setPassword(YamlConfig.config.server.DB_PASS);
final int initFailTimeoutSeconds = YamlConfig.config.server.INIT_CONNECTION_POOL_TIMEOUT;
config.setInitializationFailTimeout(TimeUnit.SECONDS.toMillis(initFailTimeoutSeconds));
config.setConnectionTimeout(30 * 1000); // Hikari default config.setConnectionTimeout(30 * 1000); // Hikari default
config.setMaximumPoolSize(10); // Hikari default config.setMaximumPoolSize(10); // Hikari default
@@ -49,22 +52,17 @@ public class DatabaseConnection {
* @return true if connection to the database initiated successfully, false if not successful * @return true if connection to the database initiated successfully, false if not successful
*/ */
public static boolean initializeConnectionPool() { public static boolean initializeConnectionPool() {
final int timeoutSeconds = YamlConfig.config.server.INIT_CONNECTION_POOL_TIMEOUT;
final Instant timeout = Instant.now().plusSeconds(timeoutSeconds);
System.out.println("Initializing connection pool..."); System.out.println("Initializing connection pool...");
final HikariConfig config = getConfig(); final HikariConfig config = getConfig();
HikariDataSource hikariDataSource; Instant initStart = Instant.now();
int attempt = 1; try {
while (Instant.now().isBefore(timeout)) { dataSource = new HikariDataSource(config);
try { long initDuration = Duration.between(initStart, Instant.now()).toMillis();
hikariDataSource = new HikariDataSource(config); System.out.printf("Connection pool initialized in %d ms%n", initDuration);
} catch (Exception e) {
System.err.printf("Failed to initialize database connection pool after %d attempt(s)%n", attempt++);
continue;
}
dataSource = hikariDataSource;
return true; return true;
} catch (Exception e) {
long timeout = Duration.between(initStart, Instant.now()).getSeconds();
System.err.printf("Failed to initialize database connection pool. Gave up after %d seconds.%n", timeout);
} }
// Timed out - failed to initialize // Timed out - failed to initialize