Mysql
 sql >> Database >  >> RDS >> Mysql

Modo perfetto per utilizzare l'aggiornamento/memorizzazione dei dati MySQL senza ritardi ed errori nell'aggiornamento delle statistiche

Innanzitutto:

Per quanto posso vedere, stai chiudendo la connessione ogni volta dopo aver eseguito una query/aggiornamento. Questo è purtroppo abbastanza imperformante. Sarebbe meglio se aprisse una connessione MySQL all'avvio del Plugin e la chiudesse di nuovo quando il plugin si ferma.

Personalmente l'ho fatto in questo modo:(non significa che devi farlo in questo modo)

La variabile di connessione:

private static Connection connection;

La funzione di connessione:

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

    });
}

La mia funzione per aggiornare/scrivere voci nel 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();
        }
    });

}

La mia funzione per interrogare le informazioni dal database:

Come puoi vedere questa funzione non è asincrona. Sfortunatamente non sono riuscito a ottenere questa funzione in modo asincrono. Ma puoi facilmente aggirare questo problema semplicemente rendendo asincrona la chiamata di funzione. es: 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;
}

La funzione di chiusura:

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

Uno svantaggio di questo modo è che puoi connetterti solo a un database alla volta (che nel mio caso andava bene).

Spero che ti aiuti. Ho anche lottato molto con strani errori MySQL. Fortunatamente con questo codice funziona tutto bene.

Per rispondere alla tua domanda:

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

Per quanto ne so, ciò significa che la connessione al server MySQL è chiusa anche se il plug-in tenta di utilizzarlo. Come accennato in precedenza, l'apertura di una connessione all'inizio e lasciarla aperta fino all'arresto del plug-in dovrebbe risolvere il problema.