国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

So verwenden Sie JDBC in Java, um kontinuierliche Updates des Datenbankservers zu implementieren, ohne den RAM-Verbrauch zu erh?hen
P粉323224129
P粉323224129 2023-09-07 20:10:29
0
1
1000

Ich habe ein Kampfspiel in JavaFX geschrieben und JDBC verwendet, um Informationen in einer MySQL-Datenbank zu aktualisieren. Die meisten Aufgaben, die grundlegende Informationen vom Datenbankserver abrufen, funktionieren einwandfrei, wenn sie nicht st?ndig wiederholt werden. Das Problem entsteht, wenn ich das Programm ben?tige, um die Informationen des Gegners, wie Position, Level, Schaden usw. im Spiel st?ndig zu aktualisieren. Ich muss st?ndig ausgew?hlte Befehle an den Server senden, was den RAM erh?ht, der von dem Thread verwendet wird, der diese Befehle ausführt.

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

Ich habe nach einigen Methoden gesucht und eine sehr nützliche Methode gefunden. Nach jeder Auswahl lasse ich den Thread eine Weile ruhen, bevor ich eine weitere Auswahl vornehme. Dieser Ansatz verbessert die Leistung erheblich und der RAM-Verbrauch bleibt stabil. Dieser Ansatz eignet sich jedoch nicht für Abfrageinformationen, die st?ndig aktualisiert werden müssen, da der kurze Ruhezustand des ?select“-Threads immer noch zu einem hohen RAM-Verbrauch führt. Gibt es eine sinnvolle M?glichkeit, dieses Problem zu l?sen und meinem Spiel eine direkte Verbindung zum Datenbankserver zu erm?glichen, ohne den Zwischenspielserver zu durchlaufen?

P粉323224129
P粉323224129

Antworte allen(1)
P粉136356287

你應(yīng)該首先嘗試優(yōu)化你的變量。

你的線程在查詢時一直使用新的String,而實際上它只需要構(gòu)建一次。同樣,對于你的ResultSet,在每次進(jìn)入新的循環(huán)時,你都會在RAM中使用一個新的位置來存儲一個新的對象。

你可以通過在Java ID對象之外添加一個控制臺輸出來檢查:

System.out.println(resultSet);

然后觀察每次輸出的結(jié)果是不是不同。

像這樣:

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

然后我讓你考慮改變你的查詢,只選擇xPos/yPos不等于"-1"的值,并且只獲取真正的對手位置變化的結(jié)果,最后,也許不發(fā)送一個"new Position",而只發(fā)送兩個變量opponentX和opponentY,這樣可以避免將這個對象存儲在RAM中。

不要忘記,Java只會在代碼執(zhí)行完成后清理你的RAM對象(簡而言之),所以擁有一個永不結(jié)束的單一線程不會觸發(fā)這種情況。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage