MySQL 连接在数据库查询 Spigot 时关闭

问题描述 投票:0回答:1

我决定现在是询问的最佳时机。我已经被这个问题困扰了一个月了。基本上我连接到数据库很好,但是每当我实际输入一个条目或对数据库执行任何操作时,它就会关闭并显示

HikariDataSource (HikariPool-1) has been closed.
[16:53:19 WARN]:        at JoinEvents-1.0-SNAPSHOT.jar//com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:96)
[16:53:19 WARN]:        at JoinEvents-1.0-SNAPSHOT.jar//org.cyci.hiddeb.db.PlayerTimeTracker.recordPlaytime(PlayerTimeTracker.java:40)
[16:53:19 WARN]:        at JoinEvents-1.0-SNAPSHOT.jar//org.cyci.hidden.tasks.PlaytimeUpdaterTask.run(PlaytimeUpdaterTask.java:21)
[16:53:19 WARN]:        at org.bukkit.craftbukkit.v1_20_R1.scheduler.CraftTask.run(CraftTask.java:101)
[16:53:19 WARN]:        at org.bukkit.craftbukkit.v1_20_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:480)
[16:53:19 WARN]:        at net.minecraft.server.MinecraftServer.b(MinecraftServer.java:1480)
[16:53:19 WARN]:        at net.minecraft.server.dedicated.DedicatedServer.b(DedicatedServer.java:447)
[16:53:19 WARN]:        at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:1394)
[16:53:19 WARN]:        at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:1171)
[16:53:19 WARN]:        at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:318)
[16:53:19 WARN]:        at java.base/java.lang.Thread.run(Thread.java:833)

我正在使用的库 MySQL、HikariCP、论文。这是我的连接器的代码。

public class MySQLManager {
    private HikariDataSource dataSource;
    private ExecutorService executorService = Executors.newCachedThreadPool();

    public MySQLManager(String host, int port, String database, String username, String password) {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://" + host + ":" + port + "/" + database + "?useSSL=false");
        config.setUsername(username);
        config.setPassword(password);

        dataSource = new HikariDataSource(config);
    }

    public CompletableFuture<Void> connectAsync() {
        return CompletableFuture.runAsync(() -> {
            try (Connection conn = dataSource.getConnection()) {
                if (!conn.isClosed()) {
                    Registry.instance.getLogger().info("Connected to MySQL!");
                    createPlayerDataTable();
                } else {
                    Registry.instance.getLogger().severe("Connection is closed immediately after connecting.");
                }
            } catch (SQLException e) {
                String errorMessage = "Failed to connect to MySQL: " + e.getMessage();
                Registry.instance.getLogger().severe(errorMessage);
                throw new RuntimeException(errorMessage, e);
            }
        }, executorService);
    }

    public CompletableFuture<Void> closeConnectionAsync() {
        return CompletableFuture.runAsync(() -> {
            dataSource.close();
            Registry.instance.getLogger().info("Closed MySQL connection.");
        }, executorService);
    }

    public void shutdown() {
        executorService.shutdown();
        try {
            if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
                Registry.instance.getLogger().severe("Executor service shutdown timed out.");
                executorService.shutdownNow();
            }
        } catch (InterruptedException e) {
            Registry.instance.getLogger().severe("Executor service shutdown interrupted: " + e.getMessage());
        }
    }

    public Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

这就是我尝试将数据添加到数据库的方式

public void recordLogin(String uuid) {
        try (Connection conn = dataSource.getConnection();
             PreparedStatement statement = conn.prepareStatement(
                     "UPDATE player_data SET logins = logins + 1 WHERE uuid = ?")) {

            statement.setString(1, uuid);
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

我希望这里有人能尽快掌握我所缺乏的知识哈哈

亲切的问候, 菲尔.

java mysql minecraft hikaricp spigot
1个回答
0
投票

尝试创建连接但未获取连接,由于某种原因导致连接关闭。已修复。

© www.soinside.com 2019 - 2024. All rights reserved.