我有一个软件,一次由 2 个用户使用,他们在几个步骤中一起交互。有时一个用户必须等待另一个用户,直到他将数据插入数据库。然后必须再次检索相同的数据。
令人困惑的是,有时我会在不更改代码的情况下收到所有数据,有时只是部分数据,有时甚至什么也没有。
有没有可能,我只是“太快”地取回了它?检索发生在插入后毫秒。也许数据库需要一些时间来操作。
如果是这样,是否有可能收到类似“成功消息”的信息,即所有内容都已插入?
这是插入函数。它在循环中多次调用并插入一些数据。之后,它更新另一个表中的标记就绪:
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;
}
到目前为止,这是我的解决方案,不幸的是,如上所述,它不起作用。
编辑
设置标志时调用此函数:
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 中。
当我在控制台中返回数据时,即使它们有时会丢失,尽管它们在数据库中。
最佳答案
您的表使用什么存储引擎?如果您使用的是 MyISAM,请考虑切换到处理行级锁定和其他好东西的 InnoDB。使用 InnoDB 会产生性能成本,因此您需要确定它是否适合您的应用程序。
编辑2:答案不正确,请忽略。
关于java - MySQL:运行后返回SUCCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10390420/