Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Idealny sposób na aktualizowanie/przechowywanie danych MySQL bez opóźnień i błędów przy aktualizacji statystyk

Przede wszystkim:

O ile widzę, zamykasz połączenie za każdym razem po wykonaniu zapytania/aktualizacji. Jest to niestety dość nieefektywne. Byłoby lepiej, gdyby otworzył połączenie MySQL podczas uruchamiania wtyczki i zamknij je ponownie, gdy wtyczka się zatrzyma.

Osobiście zrobiłem to w ten sposób:(Nie oznacza to, że musisz to zrobić w ten sposób)

Zmienna połączenia:

private static Connection connection;

Funkcja łączenia:

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

    });
}

Moja funkcja aktualizacji/zapisu wpisów do bazy danych:

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

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

}

Moja funkcja do wyszukiwania informacji z bazy danych:

Jak widać, ta funkcja nie jest asynchroniczna. Niestety nie udało mi się do tej pory uzyskać tej funkcji asynchronicznej. Ale można to łatwo obejść, po prostu czyniąc wywołanie funkcji asynchronicznym. np.: 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;
}

Funkcja zamykania:

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

Wadą tego sposobu jest to, że możesz połączyć się tylko z jedną bazą danych na raz (co w moim przypadku było w porządku).

Mam nadzieję, że ci to pomoże. Dużo zmagałem się również z dziwnymi błędami MySQL. Na szczęście z tym kodem wszystko działa dobrze.

Aby odpowiedzieć na Twoje pytanie:

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

O ile wiem, oznacza to, że połączenie z serwerem MySQL jest zamknięte, mimo że wtyczka próbuje go użyć. Jak wspomniano powyżej, otwarcie połączenia na początku i pozostawienie go otwartego do momentu zatrzymania wtyczki powinno to naprawić.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uzyskaj konkretny wpis w przypadku zduplikowanego wpisu

  2. Baza zapytań przepisać URL?

  3. Jak sprawdzić, czy połączenie MySQL jest otwarte w Pythonie?

  4. Zapytanie SQL dla wspólnych znajomych

  5. java.lang.IllegalStateException:próba wykonania operacji na zamkniętej fabryce EntityManagerFactory