2012-04-30 10 views
1

私は、一度に2人のユーザーが使用するソフトウェアをいくつかのステップで一緒に使用しています。あるユーザーがデータをデータベースに挿入するまで、あるユーザーがもう一方のユーザーを待たなければならないことがあります。その後、同じデータを再度取り出す必要があります。
紛らわしいのは、コードを変更せずに、すべてのデータを受け取ることがあり、時にはデータベースからのデータだけで、場合によっては部分的でもないことがあります。
私はそれを "速すぎる"ことができますか?挿入後、検索はミリ秒となります。おそらく、データベースは操作のためにある程度の時間を必要とするでしょう。
もしそうなら、「成功メッセージ」のようなものを受け取ることができますか?すべてが挿入されていますか?MySQL:操作の後にSUCCESSを返す

これは挿入機能です。これはループ内で数回呼び出され、いくつかのデータを挿入します。他のユーザからのフラグ準備が設定されている場合

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

は、を返し、その後、上記の機能は、再度データを取得します。

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

それはliteratedモデル(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の中に置かれています。
コンソールでデータを返すと、データベースにあるものの一部が欠落していることがあります。

+0

興味深いことに、どのトランザクション分離レベルを使用していますか? – Neil

+0

申し訳ありませんが、それについて聞いたことはありません... – user1170330

+0

'id'は' session'の主キーですか?そして、両方の場合に得られるデータのサンプルを提供できますか? –

答えて

-1

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

編集2:回答が間違っています。ご了承ください。

+0

私はすでにInnoDBを使用しています。 – user1170330

関連する問題