mirror of
https://github.com/Xiao-MoMi/Custom-Fishing.git
synced 2026-01-04 15:41:35 +00:00
Fix connection used up
This commit is contained in:
@@ -46,8 +46,6 @@ import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
@@ -79,11 +77,6 @@ public class BukkitStorageManager implements StorageManager, Listener {
|
||||
@Override
|
||||
public void reload() {
|
||||
YamlDocument config = plugin.getConfigManager().loadConfig("database.yml");
|
||||
try {
|
||||
config.save(new File(plugin.getDataFolder(), "database.yml"));
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
this.serverID = config.getString("unique-server-id", "default");
|
||||
|
||||
// Check if storage type has changed and reinitialize if necessary
|
||||
|
||||
@@ -24,6 +24,7 @@ import net.momirealms.customfishing.api.storage.user.UserData;
|
||||
import net.momirealms.customfishing.bukkit.storage.method.AbstractStorage;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
@@ -145,7 +146,7 @@ public abstract class AbstractSQLDatabase extends AbstractStorage {
|
||||
// the player is online
|
||||
var data = PlayerData.empty();
|
||||
data.uuid(uuid);
|
||||
insertPlayerData(uuid, data, lock);
|
||||
insertPlayerData(uuid, data, lock, connection);
|
||||
future.complete(Optional.of(data));
|
||||
} else {
|
||||
future.complete(Optional.empty());
|
||||
@@ -202,9 +203,9 @@ public abstract class AbstractSQLDatabase extends AbstractStorage {
|
||||
}
|
||||
}
|
||||
|
||||
public void insertPlayerData(UUID uuid, PlayerData playerData, boolean lock) {
|
||||
protected void insertPlayerData(UUID uuid, PlayerData playerData, boolean lock, @Nullable Connection previous) {
|
||||
try (
|
||||
Connection connection = getConnection();
|
||||
Connection connection = previous == null ? getConnection() : previous;
|
||||
PreparedStatement statement = connection.prepareStatement(String.format(SqlConstants.SQL_INSERT_DATA_BY_UUID, getTableName("data")))
|
||||
) {
|
||||
statement.setString(1, uuid.toString());
|
||||
@@ -241,9 +242,19 @@ public abstract class AbstractSQLDatabase extends AbstractStorage {
|
||||
statement.setString(1, uuid.toString());
|
||||
ResultSet rs = statement.executeQuery();
|
||||
if (rs.next()) {
|
||||
updatePlayerData(uuid, playerData, unlock).thenRun(() -> future.complete(true));
|
||||
try (
|
||||
PreparedStatement statement2 = connection.prepareStatement(String.format(SqlConstants.SQL_UPDATE_BY_UUID, getTableName("data")))
|
||||
) {
|
||||
statement2.setInt(1, unlock ? 0 : getCurrentSeconds());
|
||||
statement2.setBlob(2, new ByteArrayInputStream(plugin.getStorageManager().toBytes(playerData)));
|
||||
statement2.setString(3, uuid.toString());
|
||||
statement2.executeUpdate();
|
||||
} catch (SQLException e) {
|
||||
plugin.getPluginLogger().warn("Failed to update " + uuid + "'s data.", e);
|
||||
}
|
||||
future.complete(true);
|
||||
} else {
|
||||
insertPlayerData(uuid, playerData, !unlock);
|
||||
insertPlayerData(uuid, playerData, !unlock, connection);
|
||||
future.complete(true);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
package net.momirealms.customfishing.bukkit.storage.method.database.sql;
|
||||
|
||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||
import dev.dejvokep.boostedyaml.YamlDocument;
|
||||
import net.momirealms.customfishing.api.BukkitCustomFishingPlugin;
|
||||
import net.momirealms.customfishing.api.mechanic.config.ConfigManager;
|
||||
@@ -25,6 +26,7 @@ import net.momirealms.customfishing.api.storage.data.PlayerData;
|
||||
import net.momirealms.customfishing.api.storage.user.UserData;
|
||||
import net.momirealms.customfishing.common.dependency.Dependency;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Constructor;
|
||||
@@ -34,12 +36,15 @@ import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
public class SQLiteProvider extends AbstractSQLDatabase {
|
||||
|
||||
private Connection connection;
|
||||
private File databaseFile;
|
||||
private Constructor<?> connectionConstructor;
|
||||
ExecutorService executor;
|
||||
|
||||
public SQLiteProvider(BukkitCustomFishingPlugin plugin) {
|
||||
super(plugin);
|
||||
@@ -55,6 +60,8 @@ public class SQLiteProvider extends AbstractSQLDatabase {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
this.executor = Executors.newFixedThreadPool(1, new ThreadFactoryBuilder().setNameFormat("cf-sqlite-%d").build());
|
||||
|
||||
this.databaseFile = new File(plugin.getDataFolder(), config.getString("SQLite.file", "data") + ".db");
|
||||
super.tablePrefix = config.getString("SQLite.table-prefix", "customfishing");
|
||||
super.createTableIfNotExist();
|
||||
@@ -62,6 +69,9 @@ public class SQLiteProvider extends AbstractSQLDatabase {
|
||||
|
||||
@Override
|
||||
public void disable() {
|
||||
if (executor != null) {
|
||||
executor.shutdown();
|
||||
}
|
||||
try {
|
||||
if (connection != null && !connection.isClosed())
|
||||
connection.close();
|
||||
@@ -105,7 +115,7 @@ public class SQLiteProvider extends AbstractSQLDatabase {
|
||||
@Override
|
||||
public CompletableFuture<Optional<PlayerData>> getPlayerData(UUID uuid, boolean lock) {
|
||||
var future = new CompletableFuture<Optional<PlayerData>>();
|
||||
plugin.getScheduler().async().execute(() -> {
|
||||
executor.execute(() -> {
|
||||
try (
|
||||
Connection connection = getConnection();
|
||||
PreparedStatement statement = connection.prepareStatement(String.format(SqlConstants.SQL_SELECT_BY_UUID, getTableName("data")))
|
||||
@@ -128,7 +138,7 @@ public class SQLiteProvider extends AbstractSQLDatabase {
|
||||
} else if (Bukkit.getPlayer(uuid) != null) {
|
||||
var data = PlayerData.empty();
|
||||
data.uuid(uuid);
|
||||
insertPlayerData(uuid, data, lock);
|
||||
insertPlayerData(uuid, data, lock, connection);
|
||||
future.complete(Optional.of(data));
|
||||
} else {
|
||||
future.complete(Optional.empty());
|
||||
@@ -141,10 +151,43 @@ public class SQLiteProvider extends AbstractSQLDatabase {
|
||||
return future;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> updateOrInsertPlayerData(UUID uuid, PlayerData playerData, boolean unlock) {
|
||||
var future = new CompletableFuture<Boolean>();
|
||||
executor.execute(() -> {
|
||||
try (
|
||||
Connection connection = getConnection();
|
||||
PreparedStatement statement = connection.prepareStatement(String.format(SqlConstants.SQL_SELECT_BY_UUID, getTableName("data")))
|
||||
) {
|
||||
statement.setString(1, uuid.toString());
|
||||
ResultSet rs = statement.executeQuery();
|
||||
if (rs.next()) {
|
||||
try (
|
||||
PreparedStatement statement2 = connection.prepareStatement(String.format(SqlConstants.SQL_UPDATE_BY_UUID, getTableName("data")))
|
||||
) {
|
||||
statement2.setInt(1, unlock ? 0 : getCurrentSeconds());
|
||||
statement2.setBytes(2, plugin.getStorageManager().toBytes(playerData));
|
||||
statement2.setString(3, uuid.toString());
|
||||
statement2.executeUpdate();
|
||||
} catch (SQLException e) {
|
||||
plugin.getPluginLogger().warn("Failed to update " + uuid + "'s data.", e);
|
||||
}
|
||||
future.complete(true);
|
||||
} else {
|
||||
insertPlayerData(uuid, playerData, !unlock, connection);
|
||||
future.complete(true);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
plugin.getPluginLogger().warn("Failed to get " + uuid + "'s data.", e);
|
||||
}
|
||||
});
|
||||
return future;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> updatePlayerData(UUID uuid, PlayerData playerData, boolean unlock) {
|
||||
var future = new CompletableFuture<Boolean>();
|
||||
plugin.getScheduler().async().execute(() -> {
|
||||
executor.execute(() -> {
|
||||
try (
|
||||
Connection connection = getConnection();
|
||||
PreparedStatement statement = connection.prepareStatement(String.format(SqlConstants.SQL_UPDATE_BY_UUID, getTableName("data")))
|
||||
@@ -186,9 +229,9 @@ public class SQLiteProvider extends AbstractSQLDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertPlayerData(UUID uuid, PlayerData playerData, boolean lock) {
|
||||
protected void insertPlayerData(UUID uuid, PlayerData playerData, boolean lock, @Nullable Connection previous) {
|
||||
try (
|
||||
Connection connection = getConnection();
|
||||
Connection connection = previous == null ? getConnection() : previous;
|
||||
PreparedStatement statement = connection.prepareStatement(String.format(SqlConstants.SQL_INSERT_DATA_BY_UUID, getTableName("data")))
|
||||
) {
|
||||
statement.setString(1, uuid.toString());
|
||||
|
||||
Reference in New Issue
Block a user