Za prvé:
Pokud vidím, ukončujete připojení pokaždé, když provedete dotaz/aktualizaci. To je bohužel dost nedokonalé. Bylo by lepší otevřít připojení k MySQL při spuštění pluginu a znovu jej uzavřít, když se plugin zastaví.
Osobně jsem to udělal takto:(Neznamená to, že to musíte udělat tímto způsobem)
Proměnná připojení:
private static Connection connection;
Funkce připojení:
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());
}
});
}
Moje funkce pro aktualizaci/zápis záznamů do databáze:
public void Update(final String qry) {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
Statement stnt = connection.createStatement();
stnt.executeUpdate(qry);
} catch (SQLException e) {
e.printStackTrace();
}
});
}
Moje funkce pro dotazování informací z databáze:
Jak vidíte, tato funkce není asynchronní. Bohužel se mi to zatím nepodařilo, aby byla tato funkce asynchronní. Ale můžete to snadno obejít tím, že volání funkce nastavíte na asynchronní. příklad:
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;
}
Funkce zavření:
public static void close() {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
connection.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
});
}
Nevýhodou tohoto způsobu je, že se můžete najednou připojit pouze k jedné databázi (což bylo v mém případě v pořádku).
Doufám, že vám to pomůže. Také jsem hodně bojoval s podivnými chybami MySQL. Naštěstí s tímto kódem vše funguje dobře.
Odpověď na vaši otázku:
[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.
Pokud vím, znamená to, že připojení k serveru MySQL je uzavřeno, i když se jej plugin pokouší použít. Jak je uvedeno výše, otevření připojení na začátku a ponechání otevřeného, dokud se plugin nezastaví, by to mělo vyřešit.