Trước hết:
Theo như tôi thấy, bạn luôn đóng kết nối sau khi bạn thực thi Truy vấn / Cập nhật. Điều này không may là khá không phù hợp. Sẽ tốt hơn nếu bạn mở kết nối MySQL khi Plugin khởi động và đóng lại khi plugin dừng.
Cá nhân tôi đã làm theo cách này:(Không có nghĩa là bạn phải làm theo cách này)
Biến kết nối:
private static Connection connection;
Chức năng kết nối:
public static void connect(String host, String user, String password, String database) {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
//close Connection if still active
if (connection != null) {
close();
}
//connect to database host
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://" + host + "/" + database, user, password);
} catch (SQLException e) {
System.out.println(e.getMessage());
}
});
}
Chức năng của tôi để cập nhật / ghi các mục nhập vào cơ sở dữ liệu:
public void Update(final String qry) {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
Statement stnt = connection.createStatement();
stnt.executeUpdate(qry);
} catch (SQLException e) {
e.printStackTrace();
}
});
}
Chức năng của tôi để truy vấn thông tin từ cơ sở dữ liệu:
Như bạn có thể thấy là chức năng này không đồng bộ. Rất tiếc, tôi đã không quản lý nó vào lúc này để có được chức năng này không đồng bộ. Nhưng bạn có thể dễ dàng giải quyết vấn đề này bằng cách thực hiện lệnh gọi hàm không đồng bộ. ví dụ:
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> { Query("your query");
});
public ResultSet Query(String qry) {
ResultSet rs = null;
try {
Statement stnt = connection.createStatement();
rs = stnt.executeQuery(qry);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
Hàm đóng:
public static void close() {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
connection.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
});
}
Một nhược điểm của cách này là bạn chỉ có thể kết nối với một Cơ sở dữ liệu tại một thời điểm (trong trường hợp của tôi là tốt).
Hy vọng nó sẽ giúp bạn. Tôi cũng đã đấu tranh rất nhiều với các lỗi MySQL kỳ lạ. May mắn thay với mã này, mọi thứ hoạt động tốt.
Để trả lời câu hỏi của bạn:
[22:31:18] [Craft Scheduler Thread - 71/WARN]: Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
Theo như tôi biết thì điều này có nghĩa là kết nối với MySQL Server đã bị đóng mặc dù plugin cố gắng sử dụng nó.