Pertama-tama:
Sejauh yang saya bisa lihat, Anda menutup koneksi setiap kali Anda menjalankan Query/Update. Sayangnya ini cukup tidak berkinerja baik. Akan lebih baik jika membuka koneksi MySQL saat Plugin dimulai dan menutupnya kembali saat plugin berhenti.
Saya pribadi membuatnya seperti ini:(Tidak berarti Anda harus melakukannya dengan cara ini)
Variabel koneksi:
private static Connection connection;
Fungsi koneksi:
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());
}
});
}
Fungsi saya untuk memperbarui/menulis entri ke dalam database:
public void Update(final String qry) {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
Statement stnt = connection.createStatement();
stnt.executeUpdate(qry);
} catch (SQLException e) {
e.printStackTrace();
}
});
}
Fungsi saya untuk menanyakan informasi dari database:
Seperti yang Anda lihat, apakah fungsi ini tidak asinkron. Sayangnya saya tidak berhasil sekarang untuk mendapatkan fungsi ini asinkron. Tetapi Anda dapat dengan mudah mengatasi ini hanya dengan membuat panggilan fungsi tidak sinkron. mis:
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;
}
Fungsi tutup:
public static void close() {
Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
try {
connection.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
});
}
Kerugian dari cara ini adalah Anda hanya dapat terhubung ke satu Database pada suatu Waktu (yang dalam kasus saya baik-baik saja).
Semoga membantu Anda. Saya juga banyak berjuang dengan Kesalahan MySQL yang aneh. Untungnya dengan kode ini semuanya bekerja dengan baik.
Untuk menjawab pertanyaan Anda:
[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.
Sejauh yang saya tahu ini berarti koneksi ke Server MySQL ditutup meskipun plugin mencoba menggunakannya. Seperti disebutkan di atas, membuka koneksi di awal dan membiarkannya terbuka sampai plugin berhenti harus memperbaikinya.