2012-04-30 2 views
1

한 번에 2 명의 사용자가 사용하는 소프트웨어가 여러 단계로 상호 작용합니다. 때때로 한 사용자는 데이터를 데이터베이스에 삽입 할 때까지 다른 사용자를 기다려야합니다. 그런 다음 동일한 데이터를 다시 검색해야합니다.
혼란스러운 점은 때로는 코드를 변경하지 않고 모든 데이터, 때로는 데이터베이스의 일부만 제공한다는 것입니다.
"너무 빨리"검색 할 수 있습니까? 삽입 후 밀리 초이 검색됩니다. 어쩌면 데이터베이스 작업에 약간의 시간이 필요할 수도 있습니다.
그렇다면 모든 것이 삽입 된 "success-message"와 같은 것을받을 수 있습니까?MySQL : 작동 후 성공을 반환하십시오.

삽입 기능입니다. 루프 내에서 여러 번 호출되고 일부 데이터가 삽입됩니다. 다른 사용자로부터 플래그 준비이 설정되어있는 경우

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

관련 문제