Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách hoàn hảo để sử dụng cập nhật / lưu trữ dữ liệu MySQL mà không có độ trễ và lỗi khi cập nhật số liệu thống kê

Trước hết:

Theo như tôi thấy, bạn luôn đóng kết nối sau khi bạn thực thi Truy vấn / Cập nhật. Điều này không may là khá không phù hợp. Sẽ tốt hơn nếu bạn mở kết nối MySQL khi Plugin khởi động và đóng lại khi plugin dừng.

Cá nhân tôi đã làm theo cách này:(Không có nghĩa là bạn phải làm theo cách này)

Biến kết nối:

private static Connection connection;

Chức năng kết nối:

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

    });
}

Chức năng của tôi để cập nhật / ghi các mục nhập vào cơ sở dữ liệu:

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

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

}

Chức năng của tôi để truy vấn thông tin từ cơ sở dữ liệu:

Như bạn có thể thấy là chức năng này không đồng bộ. Rất tiếc, tôi đã không quản lý nó vào lúc này để có được chức năng này không đồng bộ. Nhưng bạn có thể dễ dàng giải quyết vấn đề này bằng cách thực hiện lệnh gọi hàm không đồng bộ. ví dụ: 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;
}

Hàm đóng:

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

Một nhược điểm của cách này là bạn chỉ có thể kết nối với một Cơ sở dữ liệu tại một thời điểm (trong trường hợp của tôi là tốt).

Hy vọng nó sẽ giúp bạn. Tôi cũng đã đấu tranh rất nhiều với các lỗi MySQL kỳ lạ. May mắn thay với mã này, mọi thứ hoạt động tốt.

Để trả lời câu hỏi của bạn:

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

Theo như tôi biết thì điều này có nghĩa là kết nối với MySQL Server đã bị đóng mặc dù plugin cố gắng sử dụng nó.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thoát khỏi chế độ SQL NGHIÊM TÚC trong MySQL

  2. Tránh bế tắc MySQL khi nâng cấp được chia sẻ lên khóa độc quyền

  3. Chạy các tệp MySQL * .sql trong PHP

  4. Kết hợp bất hợp pháp các đối chiếu trong mySQL

  5. Thay đổi bảng nếu tồn tại hoặc tạo nếu không