Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Perfekte Möglichkeit, MySQL-Daten ohne Verzögerung und Fehler beim Aktualisieren von Statistiken zu aktualisieren/speichern

Zunächst einmal:

Soweit ich sehen kann, schließen Sie die Verbindung jedes Mal, nachdem Sie eine Abfrage / Aktualisierung ausgeführt haben. Das ist leider ziemlich imperformant. Es wäre besser, eine MySQL-Verbindung zu öffnen, wenn das Plugin startet, und sie wieder zu schließen, wenn das Plugin stoppt.

Ich persönlich habe es so gemacht:(bedeutet nicht, dass Sie es so machen müssen)

Die Verbindungsvariable:

private static Connection connection;

Die Connect-Funktion:

    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());
        }

    });
}

Meine Funktion zum Aktualisieren/Schreiben von Einträgen in die Datenbank:

    public void Update(final String qry) {
    Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
        try {
            Statement stnt = connection.createStatement();
            stnt.executeUpdate(qry);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    });

}

Meine Funktion zum Abfragen von Informationen aus der Datenbank:

Wie Sie sehen können, ist diese Funktion nicht asynchron. Leider habe ich es bisher nicht geschafft, diese Funktion asynchron hinzubekommen. Sie können dies jedoch leicht umgehen, indem Sie den Funktionsaufruf einfach asynchron machen. Bsp.: 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;
}

Die Schließfunktion:

    public static void close() {
    Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
        try {
            connection.close();
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    });
}

Ein Nachteil dieser Methode ist, dass Sie sich jeweils nur mit einer Datenbank verbinden können (was in meinem Fall völlig in Ordnung war).

Hoffe es hilft dir. Ich hatte auch viel mit seltsamen MySQL-Fehlern zu kämpfen. Glücklicherweise funktioniert mit diesem Code alles einwandfrei.

Um Ihre Frage zu beantworten:

[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.

Soweit ich weiß, bedeutet dies, dass die Verbindung zum MySQL-Server geschlossen wird, obwohl das Plugin versucht, sie zu verwenden. Wie oben erwähnt, sollte das Öffnen einer Verbindung zu Beginn und das Offenlassen, bis das Plugin stoppt, dies beheben.