sql >> Databáze >  >> RDS >> Mysql

Perfektní způsob, jak používat aktualizaci/ukládání dat MySQL bez zpoždění a chyb při aktualizaci statistik

Za prvé:

Pokud vidím, ukončujete připojení pokaždé, když provedete dotaz/aktualizaci. To je bohužel dost nedokonalé. Bylo by lepší otevřít připojení k MySQL při spuštění pluginu a znovu jej uzavřít, když se plugin zastaví.

Osobně jsem to udělal takto:(Neznamená to, že to musíte udělat tímto způsobem)

Proměnná připojení:

private static Connection connection;

Funkce připojení:

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

    });
}

Moje funkce pro aktualizaci/zápis záznamů do databáze:

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

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

}

Moje funkce pro dotazování informací z databáze:

Jak vidíte, tato funkce není asynchronní. Bohužel se mi to zatím nepodařilo, aby byla tato funkce asynchronní. Ale můžete to snadno obejít tím, že volání funkce nastavíte na asynchronní. příklad: 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;
}

Funkce zavření:

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

Nevýhodou tohoto způsobu je, že se můžete najednou připojit pouze k jedné databázi (což bylo v mém případě v pořádku).

Doufám, že vám to pomůže. Také jsem hodně bojoval s podivnými chybami MySQL. Naštěstí s tímto kódem vše funguje dobře.

Odpověď na vaši otázku:

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

Pokud vím, znamená to, že připojení k serveru MySQL je uzavřeno, i když se jej plugin pokouší použít. Jak je uvedeno výše, otevření připojení na začátku a ponechání otevřeného, ​​dokud se plugin nezastaví, by to mělo vyřešit.



  1. H2 – Chyba při přístupu k propojené tabulce pomocí příkazu SQL SELECT * FROM null T

  2. mySQL rozdělení na více souborů vs. výkon jednoho souboru?

  3. 10 důvodů, proč vaše firma potřebuje Microsoft Access

  4. Rychlé a špinavé pro smyčky v okamžitém okně