我决定现在是询问的最佳时机。我已经被这个问题困扰了一个月了。基本上我连接到数据库很好,但是每当我实际输入一个条目或对数据库执行任何操作时,它就会关闭并显示
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();
}
}
我希望这里有人能尽快掌握我所缺乏的知识哈哈
亲切的问候, 菲尔.
尝试创建连接但未获取连接,由于某种原因导致连接关闭。已修复。