Mysql
 sql >> база данни >  >> RDS >> Mysql

Перфектен начин да използвате актуализиране/съхранение на MySQL данни без забавяне и грешка при актуализиране на статистиката

Първо:

Доколкото виждам, вие затваряте връзката всеки път, след като изпълните заявка/актуализация. Това за съжаление е доста неефективно. Би било по-добре да отворите MySQL връзка, когато приставката стартира, и да я затворите отново, когато приставката спре.

Аз лично го направих по този начин:(Не означава, че трябва да го направите по този начин)

Променливата на връзката:

private static Connection connection;

Функцията за свързване:

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

    });
}

Моята функция за актуализиране/записване на записи в базата данни:

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

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

}

Моята функция за запитване на информация от базата данни:

Както можете да видите, тази функция не е асинхронна. За съжаление досега не успях да направя тази функция асинхронна. Но можете лесно да заобиколите това, като просто направите извикването на функцията асинхронно. например: 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;
}

Функцията за затваряне:

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

Недостатък на този начин е, че можете да се свържете само с една база данни наведнъж (което в моя случай беше добре).

Надявам се да ви помогне. Също така се борих много със странни MySQL грешки. За щастие с този код всичко работи добре.

За да отговоря на въпроса си:

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

Доколкото знам това означава, че връзката с MySQL сървъра е затворена, въпреки че плъгинът се опитва да го използва. Както беше споменато по-горе, отварянето на връзка в началото и оставянето й отворено, докато приставката спре, трябва да поправи това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Пагинация в хибернация със съединени таблици

  2. Алтернатива на освен в MySQL

  3. Как да проверя дали MySQL връзка е отворена в Python?

  4. Максимална дължина на колоната на JSON в MySQL

  5. Sqlite Добавяне на колона в таблица на определена позиция (Android)