Först och främst:
Såvitt jag kan se stänger du anslutningen varje gång efter att du kört en fråga/uppdatering. Detta är tyvärr ganska imperformant. Det skulle vara bättre om du öppnade en MySQL-anslutning när plugin-programmet startar och stänger igen när plugin-programmet slutar.
Jag gjorde det personligen så här:(Betyder inte att du måste göra på det här sättet)
Anslutningsvariabeln:
private static Connection connection;
Anslutningsfunktionen:
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());
}
});
}
Min funktion för att uppdatera/skriva poster i databasen:
public void Update(final String qry) {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
Statement stnt = connection.createStatement();
stnt.executeUpdate(qry);
} catch (SQLException e) {
e.printStackTrace();
}
});
}
Min funktion för att söka information från databasen:
Som du kan se är denna funktion inte asynkron. Jag har tyvärr inte lyckats med det nu för att få den här funktionen asynkron. Men du kan enkelt lösa detta genom att bara göra funktionsanropet asynkront. ex:
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;
}
Stängfunktionen:
public static void close() {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
connection.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
});
}
En nackdel med det här sättet är att du bara kan ansluta till en databas åt gången (vilket var bra i mitt fall).
Hoppas det hjälper dig. Jag kämpade också mycket med konstiga MySQL-fel. Lyckligtvis fungerar allt bra med den här koden.
För att svara på din fråga:
[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.
Så vitt jag vet betyder detta att anslutningen till MySQL-servern är stängd trots att plugin-programmet försöker använda den. Som nämnts ovan bör det lösa detta genom att öppna en anslutning i början och lämna den öppen tills plugin-programmet slutar.