Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Maneira perfeita de usar a atualização/armazenamento de dados do MySQL sem atraso e erro na atualização de estatísticas


Em primeiro lugar:

Até onde posso ver, você está fechando a conexão toda vez que executa uma consulta/atualização. Isso infelizmente é bastante imperformável. Seria melhor se abrisse uma conexão MySQL quando o Plugin iniciar e fechá-la novamente quando o plugin parar.

Eu pessoalmente fiz assim:(não significa que você tem que fazer assim)

A variável de conexão:
private static Connection connection;

A função de conexão:
    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());
        }

    });
}

Minha função para atualizar/escrever entradas no banco de dados:
    public void Update(final String qry) {
    Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
        try {
            Statement stnt = connection.createStatement();
            stnt.executeUpdate(qry);

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

}

Minha função para consultar informações do banco de dados:

Como você pode ver, esta função não é assíncrona. Infelizmente, não consegui até agora para obter essa função assíncrona. Mas você pode facilmente contornar isso apenas tornando a chamada de função assí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;
}

A função fechar:
    public static void close() {
    Bukkit.getScheduler().runTaskAsynchronously(Main.getInstance(), () -> {
        try {
            connection.close();
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    });
}

Uma desvantagem dessa maneira é que você só pode se conectar a um banco de dados por vez (o que no meu caso foi bom).

Espero que ajude você. Eu também lutei muito com erros estranhos do MySQL. Felizmente com este código tudo funciona bem.

Para responder sua pergunta:
[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.

Até onde eu sei, isso significa que a conexão com o MySQL Server está fechada mesmo que o plugin tente usá-la. Como mencionado acima, abrir uma conexão no início e deixá-la aberta até que o plugin pare deve corrigir isso.