सबसे पहले:
जहां तक मैं देख सकता हूं, आप क्वेरी/अपडेट निष्पादित करने के बाद हर बार कनेक्शन बंद कर रहे हैं। यह दुर्भाग्य से काफी प्रदर्शनकारी है। यह बेहतर होगा कि प्लगइन शुरू होने पर एक 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());
}
});
}
इस तरह का एक नुकसान यह है कि आप एक समय में केवल एक डेटाबेस से जुड़ सकते हैं (जो मेरे मामले में ठीक था)।
आशा है कि यह आपकी मदद करता है। मैंने अजीब 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 सर्वर से कनेक्शन बंद है। जैसा कि ऊपर बताया गया है कि शुरुआत में एक कनेक्शन खोलना और प्लगइन बंद होने तक इसे खुला छोड़ना इसे ठीक करना चाहिए।