Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara sempurna untuk menggunakan pembaruan/penyimpanan data MySQL tanpa jeda dan kesalahan saat memperbarui statistik

Pertama-tama:

Sejauh yang saya bisa lihat, Anda menutup koneksi setiap kali Anda menjalankan Query/Update. Sayangnya ini cukup tidak berkinerja baik. Akan lebih baik jika membuka koneksi MySQL saat Plugin dimulai dan menutupnya kembali saat plugin berhenti.

Saya pribadi membuatnya seperti ini:(Tidak berarti Anda harus melakukannya dengan cara ini)

Variabel koneksi:

private static Connection connection;

Fungsi koneksi:

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

    });
}

Fungsi saya untuk memperbarui/menulis entri ke dalam database:

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

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

}

Fungsi saya untuk menanyakan informasi dari database:

Seperti yang Anda lihat, apakah fungsi ini tidak asinkron. Sayangnya saya tidak berhasil sekarang untuk mendapatkan fungsi ini asinkron. Tetapi Anda dapat dengan mudah mengatasi ini hanya dengan membuat panggilan fungsi tidak sinkron. mis: 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;
}

Fungsi tutup:

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

Kerugian dari cara ini adalah Anda hanya dapat terhubung ke satu Database pada suatu Waktu (yang dalam kasus saya baik-baik saja).

Semoga membantu Anda. Saya juga banyak berjuang dengan Kesalahan MySQL yang aneh. Untungnya dengan kode ini semuanya bekerja dengan baik.

Untuk menjawab pertanyaan Anda:

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

Sejauh yang saya tahu ini berarti koneksi ke Server MySQL ditutup meskipun plugin mencoba menggunakannya. Seperti disebutkan di atas, membuka koneksi di awal dan membiarkannya terbuka sampai plugin berhenti harus memperbaikinya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pernyataan penyisipan PDO dengan loop melalui array $_POST

  2. menggunakan mysqli untuk mencegah injeksi sql, bagaimana cara mengatur NULL atau CURRENT_DATE?

  3. Histogram kueri MySql untuk data interval waktu

  4. Bagaimana mengabaikan baris duplikat saat menyisipkan

  5. Pernyataan yang disiapkan PHP PDO -- MySQL LIKE query