diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9843730d..9dd08879 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,7 +19,7 @@ adventure-text-minimessage = "4.26.1" item-nbt-api = "2.16.0" # Utilities / Libraries -sarah = "1.25" +sarah = "1.26" currenciesapi = "1.0.15" folialib = "0.5.1" xseries = "13.8.0" diff --git a/src/main/java/fr/maxlego08/menu/storage/ZStorageManager.java b/src/main/java/fr/maxlego08/menu/storage/ZStorageManager.java index ae62cc50..fa786458 100644 --- a/src/main/java/fr/maxlego08/menu/storage/ZStorageManager.java +++ b/src/main/java/fr/maxlego08/menu/storage/ZStorageManager.java @@ -76,11 +76,18 @@ public void loadDatabase() { } Logger logger = JULogger.from(this.plugin.getLogger()); + DatabaseType databaseType = storageType.equalsIgnoreCase("SQLITE") ? DatabaseType.SQLITE : storageType.equalsIgnoreCase("MYSQL") ? DatabaseType.MYSQL : DatabaseType.MARIADB; + DatabaseConfiguration databaseConfiguration = new DatabaseConfiguration(prefix, user, password, port, host, dataBase, enableDebug, databaseType); + Long maxLifetimeMillis = globalDatabaseConfiguration.getMaxLifetimeMillis(); + if (maxLifetimeMillis != null) { + databaseConfiguration = databaseConfiguration.withMaxLifetime(maxLifetimeMillis); + } + DatabaseConnection databaseConnection; if (storageType.equalsIgnoreCase("SQLITE")) { - databaseConnection = new SqliteConnection(new DatabaseConfiguration(prefix, user, password, port, host, dataBase, enableDebug, DatabaseType.SQLITE), this.plugin.getDataFolder(), logger); + databaseConnection = new SqliteConnection(databaseConfiguration, this.plugin.getDataFolder(), logger); } else { - databaseConnection = new HikariDatabaseConnection(new DatabaseConfiguration(prefix, user, password, port, host, dataBase, enableDebug, storageType.equalsIgnoreCase("MYSQL") ? DatabaseType.MYSQL : DatabaseType.MARIADB), logger); + databaseConnection = new HikariDatabaseConnection(databaseConfiguration, logger); } this.requestHelper = new RequestHelper(databaseConnection, logger); diff --git a/src/main/java/fr/maxlego08/menu/zcore/utils/GlobalDatabaseConfiguration.java b/src/main/java/fr/maxlego08/menu/zcore/utils/GlobalDatabaseConfiguration.java index f42d205e..01dcf4dd 100644 --- a/src/main/java/fr/maxlego08/menu/zcore/utils/GlobalDatabaseConfiguration.java +++ b/src/main/java/fr/maxlego08/menu/zcore/utils/GlobalDatabaseConfiguration.java @@ -4,6 +4,7 @@ import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; +import java.util.concurrent.TimeUnit; public class GlobalDatabaseConfiguration { @@ -102,4 +103,18 @@ public String getTablePrefix() { public boolean isDebug() { return this.globalConfiguration == null ? this.pluginConfiguration.getBoolean("database-configuration.debug") : this.globalConfiguration.getBoolean("database-configuration.debug", this.pluginConfiguration.getBoolean("database-configuration.debug", false)); } + + /** + * Maximum pooled-connection lifetime, in milliseconds, for MySQL and MariaDB. + * A missing or negative value keeps Sarah's default of 30 minutes. {@code 0} disables retirement. + * + * @return the lifetime in milliseconds, or {@code null} to keep the library default + */ + public Long getMaxLifetimeMillis() { + long seconds = this.globalConfiguration == null ? this.pluginConfiguration.getLong("database-configuration.max-lifetime", -1L) : this.globalConfiguration.getLong("database-configuration.max-lifetime", this.pluginConfiguration.getLong("database-configuration.max-lifetime", -1L)); + if (seconds < 0) { + return null; + } + return TimeUnit.SECONDS.toMillis(seconds); + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 2a96840d..23aa006e 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -63,6 +63,10 @@ database-configuration: database: zmenu # Enable of not the SQL debug mode debug: false + # Maximum lifetime of a pooled MySQL or MariaDB connection, in seconds. + # A connection older than this is retired and replaced. 0 keeps connections until the pool closes. + # Hikari requires at least 30 seconds. 1800 is 30 minutes, the same default used when this option is omitted. + max-lifetime: 1800 # Time in seconds for saving data in batches. # Instead of making an SQL query for each update, a single query will be executed every 10 seconds