处理线程中丢失数据库连接 - Java

时间:2012-06-27 14:03:04

标签: java mysql database

我有一个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;

        }
    }
}

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

由于

1 个答案:

答案 0 :(得分:0)

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

在阅读你的问题时我想到的一个想法如下,如果有兴趣请继续阅读,如果我猜错了就忽略了!

您正在做的是轮询数据库中的“新”数据。问题是,即使你在其中一个民意调查中获得了较新的数据,你也使得用户执行的下一个交易不会基于陈旧数据更安全。这是一个基本的并发问题,无论你做什么“技巧”,你都无法摆脱里面你的交易。

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