Първо:
Доколкото виждам, вие затваряте връзката всеки път, след като изпълните заявка/актуализация. Това за съжаление е доста неефективно. Би било по-добре да отворите MySQL връзка, когато приставката стартира, и да я затворите отново, когато приставката спре.
Аз лично го направих по този начин:(Не означава, че трябва да го направите по този начин)
Променливата на връзката:
private static Connection connection;
Функцията за свързване:
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());
}
});
}
Моята функция за актуализиране/записване на записи в базата данни:
public void Update(final String qry) {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
Statement stnt = connection.createStatement();
stnt.executeUpdate(qry);
} catch (SQLException e) {
e.printStackTrace();
}
});
}
Моята функция за запитване на информация от базата данни:
Както можете да видите, тази функция не е асинхронна. За съжаление досега не успях да направя тази функция асинхронна. Но можете лесно да заобиколите това, като просто направите извикването на функцията асинхронно. например:
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;
}
Функцията за затваряне:
public static void close() {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
connection.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
});
}
Недостатък на този начин е, че можете да се свържете само с една база данни наведнъж (което в моя случай беше добре).
Надявам се да ви помогне. Също така се борих много със странни MySQL грешки. За щастие с този код всичко работи добре.
За да отговоря на въпроса си:
[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.
Доколкото знам това означава, че връзката с MySQL сървъра е затворена, въпреки че плъгинът се опитва да го използва. Както беше споменато по-горе, отварянето на връзка в началото и оставянето й отворено, докато приставката спре, трябва да поправи това.