Rumah  >  Soal Jawab  >  teks badan

Cara menggunakan JDBC dalam Java untuk melaksanakan kemas kini berterusan pelayan pangkalan data tanpa meningkatkan penggunaan RAM

Saya menulis permainan pertarungan dalam JavaFX, menggunakan JDBC untuk mengemas kini maklumat ke dalam pangkalan data MySQL. Kebanyakan tugasan yang mendapat maklumat asas daripada pelayan pangkalan data berfungsi dengan baik jika ia tidak diulang secara berterusan. Masalah timbul apabila saya memerlukan program untuk sentiasa mengemas kini maklumat pihak lawan, seperti kedudukan, tahap, kerosakan, dan lain-lain dalam permainan. Saya perlu sentiasa menghantar arahan terpilih ke pelayan, yang meningkatkan RAM yang digunakan oleh benang yang menjalankan arahan ini.

void startUpdatingOpponentInfo() {
    Thread thread = new Thread(() -> {
        while (matchID != -1) {
            String query = String.format("select * from matchDetails where matchID = %d and userID = %d", matchID, opponentID);
            try {
                ResultSet resultSet = sqlConnection.getDataQuery(query);
                while (resultSet.next()) {
                    double opponentX = resultSet.getDouble("xPos");
                    double opponentY = resultSet.getDouble("YPos");
                    if (opponentX != -1 && opponentY != -1)
                        opponent.move(canvas, new Position(opponentX, opponentY));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    });
}

  public ResultSet getDataQuery(String query) {
    Statement statement;
    ResultSet resultSet = null;
    try {
        statement = connection.createStatement();
        resultSet = statement.executeQuery(query);
    } catch (SQLException e) {
        System.out.println(query);
        e.printStackTrace();
    }
    return resultSet;
}

Saya cuba mencari beberapa kaedah dan menemui kaedah yang sangat berguna. Selepas setiap pilihan, saya biarkan benang tidur seketika sebelum membuat pilihan lain. Pendekatan ini meningkatkan prestasi dengan ketara dan penggunaan RAM kekal stabil. Walau bagaimanapun, pendekatan ini tidak sesuai untuk maklumat pertanyaan yang perlu disegarkan sepanjang masa, kerana tidur pendek benang "pilih" masih akan menyebabkan penggunaan RAM yang tinggi. Adakah terdapat cara yang berguna untuk menyelesaikan masalah ini dan biarkan permainan saya menyambung terus ke pelayan pangkalan data tanpa melalui pelayan permainan perantaraan.

P粉323224129P粉323224129408 hari yang lalu758

membalas semua(1)saya akan balas

  • P粉136356287

    P粉1363562872023-09-08 16:23:50

    Anda harus cuba mengoptimumkan pembolehubah anda terlebih dahulu.

    Urutan anda terus menggunakan Rentetan baharu semasa membuat pertanyaan, padahal ia hanya perlu dibina sekali sahaja. Begitu juga, untuk ResultSet anda, setiap kali anda memasukkan gelung baharu, anda menggunakan lokasi baharu dalam RAM untuk menyimpan objek baharu.

    Anda boleh menyemak ini dengan menambahkan output konsol di luar objek Java ID:

    System.out.println(resultSet);

    Kemudian perhatikan sama ada hasil output berbeza setiap kali.

    Seperti ini:

    Thread thread = new Thread(() -> {
    
            ResultSet resultSet;
            final String query = String.format("select * from matchDetails where matchID = %d and userID = %d", matchID, opponentID);
    
            while (matchID != -1) {
                try {
                    resultSet = sqlConnection.getDataQuery(query);

    Kemudian saya meminta anda untuk mempertimbangkan untuk menukar pertanyaan anda kepada hanya memilih nilai di mana xPos/yPos tidak sama dengan "-1", dan hanya mendapat keputusan perubahan kedudukan lawan sebenar, dan akhirnya, mungkin bukannya menghantar "baru Position", hanya hantar Dua pembolehubah opponentX dan opponentY, ini mengelakkan daripada menyimpan objek ini dalam RAM.

    Jangan lupa, Java hanya membersihkan objek RAM anda selepas pelaksanaan kod selesai (pendek kata), jadi mempunyai satu utas yang tidak pernah berakhir tidak akan mencetuskan ini.

    balas
    0
  • Batalbalas