Mysql
 sql >> Base de données >  >> RDS >> Mysql

Moyen idéal pour utiliser la mise à jour/stockage des données MySQL sans décalage ni erreur lors de la mise à jour des statistiques

Tout d'abord :

Autant que je sache, vous fermez la connexion à chaque fois après avoir exécuté une requête/mise à jour. C'est malheureusement assez peu performant. Il serait préférable d'ouvrir une connexion MySQL lorsque le plugin démarre et de la refermer lorsque le plugin s'arrête.

Personnellement, je l'ai fait de cette façon :(cela ne signifie pas que vous devez le faire de cette façon)

La variable de connexion :

private static Connection connection;

La fonction de connexion :

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

    });
}

Ma fonction pour mettre à jour/écrire des entrées dans la base de données :

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

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

}

Ma fonction pour interroger les informations de la base de données :

Comme vous pouvez le voir, cette fonction n'est pas asynchrone. Je n'ai malheureusement pas réussi à obtenir cette fonction asynchrone. Mais vous pouvez facilement contourner ce problème en rendant simplement l'appel de fonction asynchrone. ex: 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 fonction de fermeture :

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

Un inconvénient de cette méthode est que vous ne pouvez vous connecter qu'à une seule base de données à la fois (ce qui était très bien dans mon cas).

J'espère que cela vous aide. J'ai aussi beaucoup lutté avec des erreurs MySQL étranges. Heureusement, avec ce code, tout fonctionne très bien.

Pour répondre à votre question :

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

Autant que je sache, cela signifie que la connexion au serveur MySQL est fermée même si le plugin essaie de l'utiliser. Comme mentionné ci-dessus, ouvrir une connexion au début et la laisser ouverte jusqu'à ce que le plugin s'arrête devrait résoudre ce problème.