1

一度に 2 人のユーザーが使用するソフトウェアがあり、いくつかの手順で相互にやり取りします。データベースにデータを挿入するまで、1 人のユーザーが別のユーザーを待たなければならない場合があります。その後、同じデータを再度取得する必要があります。
紛らわしいのは、コードを変更せずに、データベースからすべてのデータを受け取ったり、一部だけを受け取ったり、データベースから何も受け取っていないこともあります。
「速すぎる」だけで取得できる可能性はありますか?取得は、挿入後数ミリ秒で行われます。データベースの操作に時間がかかる場合があります。
もしそうなら、すべてが挿入されたという「成功メッセージ」のようなものを受け取ることは可能ですか?

これが挿入機能です。ループ内で数回呼び出され、データを挿入します。その後、別のテーブルで準備完了フラグを更新します。

public void insert(String name, int id) {
    try {
        stmt = conn.prepareStatement("INSERT INTO user(name) VALUES (?)");
        stmt.setString(1, name);
        stmt.executeUpdate();
        stmt = conn.prepareStatement("UPDATE session set ready = 1 WHERE id = ?");
        stmt.setInt(1, id);
        stmt.executeUpdate();
        stmt.close();
    } catch (SQLException ex) {
        System.err.println(ex);
    }
}

次に、これらの両方の関数は、他のユーザーからの準備完了フラグが設定されているかどうかを毎秒チェックします。

    timer.schedule(new TimerTask() {

        @Override
        public void run() {
            if (DB.INSTANCE.check(5)) {
                // retrieving data from database...
                timer.cancel();
            }
        }
    }, 0, 1000);

フラグが設定されている場合、trueが返され、上記の関数がデータを再度取得します。

public boolean check(int id) {
    boolean notify = false;
    try {
        stmt = conn.prepareStatement("SELECT * FROM session WHERE id = ?");
        stmt.setString(1, id);
        stmt.executeQuery();
        while (stmt.getResultSet().next()) {
            if (stmt.getResultSet().getInt("ready") == 1) {
                notify = true;
            }
        }
        stmt.close();
    } catch (SQLException ex) {
        System.err.println(ex);
    }
    return notify;
}

これはこれまでの私の解決策ですが、残念ながら上記のように機能しません。

EDIT
この関数は、フラグが設定されたときに呼び出されます。

public void load() {
    data= DB.INSTANCE.loadChosen(id);
    if (data.isEmpty()) {
        model.addElement("Nothing!");
    } else {
        for (Map.Entry e : data.entrySet()) {
            System.out.println(e.getKey() + " = " + e.getValue());
            model.addElement(e.getKey());
        }
    }
}

それは読み書きされ、モデル (JList) に入れられています。
これは、データベース クラスの対応する関数です。

public HashMap load(int id) {
    try {
        stmt = conn.prepareStatement("SELECT * FROM users WHERE id LIKE ?");
        stmt.setString(1, id);
        stmt.executeQuery();
        while (stmt.getResultSet().next()) {
            String name = stmt.getResultSet().getString("name");
            int coe1 = stmt.getResultSet().getInt("coe1");
            chosenNames.put(name, coe1);
        }
        stmt.close();
    } catch (SQLException ex) {
        System.err.println(ex);
    }
    return data;
}

取得される実際のデータはそれほど重要ではありません。これらは単なる名前と数字であり、すべてが HashMap に格納されます。
コンソールにデータを返すと、データベースにあるにもかかわらず、一部が欠落している場合があります。

4

1 に答える 1

-1

テーブルに使用しているストレージ エンジンは何ですか? MyISAM を使用している場合は、行レベルのロックやその他の優れた機能を処理する InnoDB に切り替えることを検討してください。InnoDB を使用するとパフォーマンス コストがかかるため、アプリケーションに適しているかどうかを判断する必要があります。

編集 2: 回答が正しくありません。無視してください。

于 2012-04-30T20:55:59.483 に答える