sql >> Base de Datos >  >> RDS >> Mysql

La manera perfecta de usar la actualización/almacenamiento de datos de MySQL sin retrasos ni errores al actualizar las estadísticas

En primer lugar:

Por lo que puedo ver, está cerrando la conexión cada vez que ejecuta una Consulta/Actualización. Desafortunadamente, esto es bastante eficaz. Sería mejor abrir una conexión MySQL cuando se inicie el complemento y cerrarla nuevamente cuando se detenga.

Personalmente lo hice de esta manera:(No significa que tengas que hacerlo de esta manera)

La variable de conexión:

private static Connection connection;

La función de conexión:

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

    });
}

Mi función para actualizar/escribir entradas en la base de datos:

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

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

}

Mi función para consultar información de la base de datos:

Como puede ver, esta función no es asíncrona. Desafortunadamente, no lo logré por ahora para que esta función sea asíncrona. Pero puede solucionar esto fácilmente simplemente haciendo que la llamada a la función sea asíncrona. 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 función de cierre:

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

Una desventaja de esta forma es que solo puede conectarse a una base de datos a la vez (que en mi caso estuvo bien).

Espero que te ayude. También luché mucho con errores extraños de MySQL. Afortunadamente con este código todo funciona bien.

Para responder a su pregunta:

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

Hasta donde sé, esto significa que la conexión al servidor MySQL está cerrada aunque el complemento intente usarlo. Como se mencionó anteriormente, abrir una conexión al principio y dejarla abierta hasta que el complemento se detenga debería solucionar este problema.