한 번에 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에 배치됩니다.
콘솔에서 데이터를 반환 할 때 데이터베이스에있는 경우가 있지만 때로는 누락 된 데이터도 있습니다.
관심 분야로는 어떤 트랜잭션 격리 수준을 사용하고 있습니까? – Neil
죄송합니다. 그것에 대해 들어 본 적이 없습니다 ... – user1170330
'id'는'session'의 기본 키입니까? 두 가지 경우 모두에서 얻은 데이터 샘플을 제공 할 수 있습니까? –