【问题标题】:MySQL: Return SUCCESS after operationMySQL:操作后返回 SUCCESS
【发布时间】:2012-05-10 13:12:30
【问题描述】:

我有一个软件,一次由 2 个用户使用,他们通过几个步骤进行交互。有时一个用户必须等待另一个用户,直到他将数据插入数据库。然后必须再次检索相同的数据。
令人困惑的是,有时我会在不更改代码的情况下收到所有数据,有时只是部分数据,有时甚至什么都没有。
有没有可能,我只是“太快”地检索它?检索发生在插入后 毫秒。也许数据库需要一些时间来操作。
如果是这样,是否有可能收到类似于“成功消息”的东西,表明所有内容都已插入?

这是插入函数。它在循环中被调用多次并插入一些数据。之后,它会更新另一个表中的标志 ready

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

然后,这两个函数每秒检查一次,是否已设置来自其他用户的标志 ready

    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 中。
当我在控制台中返回数据时,即使它们中的一些有时会丢失,尽管它们在数据库中。

【问题讨论】:

  • 出于兴趣,您使用的是什么事务隔离级别?
  • 对不起,我从来没有听说过...
  • idsession 的主键吗?您能否提供在这两种情况下获得的数据样本?
  • 其实 id 并不是很重要,我稍微修改了代码,但并没有丢失真正重要的部分。

标签: java mysql database jdbc


【解决方案1】:

您的表使用什么存储引擎?如果您使用的是 MyISAM,请考虑切换到处理行级锁定和其他好东西的 InnoDB。使用 InnoDB 会产生性能成本,因此您需要确定它是否适合您的应用程序。

编辑2:答案不正确,请忽略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2021-03-28
    • 2018-10-18
    相关资源
    最近更新 更多