1

我有一个 Swing 应用程序,它使用来自外部 mysql 数据库的一些数据。

我希望这些数据是最新的,所以我有一个线程每 10 秒检查一次是否有新数据可用。

这是我的代码:

public void run() {
    maj.getIgor().open(); // open the connection to Mysql
    while (true) {
        try {
            if (maj.getIgor().getConnexion().isValid(2)) {
                maj.checkProduits(); // update the datas
            } else {
                maj.getIgor().close();
                maj.getIgor().open();
                System.out.println("Re-try to open connection");

            }
            ThreadIgor.sleep(10000);

        } catch (SQLException ex) {
            Logger.getLogger(ThreadMajProduits.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex) {
            try {
                Thread.currentThread().interrupt();
                maj.getIgor().close();

            } catch (SQLException ex1) {
                Logger.getLogger(ThreadMajProduits.class.getName()).log(Level.SEVERE, null, ex1);
            }

            break;

        }
    }
}

我想知道这是否是做我想做的事情的正确方法,如果没有风险,这个线程会通过尝试连接到数据库来阻止我的应用程序?

谢谢

4

1 回答 1

0

首先,一旦您使用连接池来连接到您的数据库,您的线程就不应该有问题导致您的应用程序出现任何延迟。如果你没有使用连接池,你最终会在你的主应用线程中引入暂停,甚至是竞争条件,如果你没有正确同步你的线程。

阅读您的问题时,我的脑海中闪过一个想法,如果有兴趣,请继续阅读,如果我猜错了,请忽略!

您所做的本质上是轮询数据库以获取“新”数据。问题是,即使您确实在其中一个民意调查中获得了更新的数据,您的用户执行的下一个事务不会基于陈旧数据,您也不会变得更安全。这是一个基本的并发问题,无论您使用什么“技巧”,您都无法事务中处理它。

如果您要完成的是动态更新用户正在操作的某种形式的数据,那么正确的做法是使用“last-update”或“version”列之类的东西。然后,当您的用户尝试将他们的更新推送到数据库时,在您的事务中,您将检查您的用户一直在编辑的数据的“最后更新”或“版本”是否与DB,从而确保在此期间没有其他人编辑过相同的数据。

于 2012-06-27T14:51:04.147 回答