まず第一に:
私が見る限り、クエリ/更新を実行した後は毎回接続を閉じています。残念ながら、これは非常に不完全です。プラグインの起動時に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());
}
});
}
この方法の欠点は、一度に1つのデータベースにしか接続できないことです(私の場合は問題ありませんでした)。
お役に立てば幸いです。また、奇妙な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サーバーを使用しようとしても、MySQLサーバーへの接続が閉じられることを意味します。前述のように、最初に接続を開き、プラグインが停止するまで開いたままにしておくと、これが修正されます。