Przede wszystkim:
O ile widzę, zamykasz połączenie za każdym razem po wykonaniu zapytania/aktualizacji. Jest to niestety dość nieefektywne. Byłoby lepiej, gdyby otworzył połączenie MySQL podczas uruchamiania wtyczki i zamknij je ponownie, gdy wtyczka się zatrzyma.
Osobiście zrobiłem to w ten sposób:(Nie oznacza to, że musisz to zrobić w ten sposób)
Zmienna połączenia:
private static Connection connection;
Funkcja łączenia:
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());
}
});
}
Moja funkcja aktualizacji/zapisu wpisów do bazy danych:
public void Update(final String qry) {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
Statement stnt = connection.createStatement();
stnt.executeUpdate(qry);
} catch (SQLException e) {
e.printStackTrace();
}
});
}
Moja funkcja do wyszukiwania informacji z bazy danych:
Jak widać, ta funkcja nie jest asynchroniczna. Niestety nie udało mi się do tej pory uzyskać tej funkcji asynchronicznej. Ale można to łatwo obejść, po prostu czyniąc wywołanie funkcji asynchronicznym. np.:
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;
}
Funkcja zamykania:
public static void close() {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
connection.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
});
}
Wadą tego sposobu jest to, że możesz połączyć się tylko z jedną bazą danych na raz (co w moim przypadku było w porządku).
Mam nadzieję, że ci to pomoże. Dużo zmagałem się również z dziwnymi błędami MySQL. Na szczęście z tym kodem wszystko działa dobrze.
Aby odpowiedzieć na Twoje pytanie:
[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.
O ile wiem, oznacza to, że połączenie z serwerem MySQL jest zamknięte, mimo że wtyczka próbuje go użyć. Jak wspomniano powyżej, otwarcie połączenia na początku i pozostawienie go otwartego do momentu zatrzymania wtyczki powinno to naprawić.