我有一个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;
}
}
}
我想知道这是否是一个正确的方法来做我想要的,如果没有风险这个线程通过尝试连接到数据库来阻止我的应用程序?
由于
答案 0 :(得分:0)
首先,只要您使用连接池获取与数据库的连接,您的线程就不会出现导致应用程序延迟的问题。如果您没有使用连接池,如果您没有正确同步线程,最终会在主应用程序线程中引入暂停,甚至是竞争条件。
在阅读你的问题时我想到的一个想法如下,如果有兴趣请继续阅读,如果我猜错了就忽略了!
您正在做的是轮询数据库中的“新”数据。问题是,即使你在其中一个民意调查中获得了较新的数据,你也不使得用户执行的下一个交易不会基于陈旧数据更安全。这是一个基本的并发问题,无论你做什么“技巧”,你都无法摆脱里面你的交易。
如果你想要完成的是动态更新用户正在操作的某种形式的数据,那么正确的做法是使用类似“最后更新”或“版本”列的内容。然后,当您的用户尝试将更新推送到数据库时,在您的事务中,您将检查用户编辑的数据的“最后更新”或“版本”是否与数据中的数据相同。 DB,因此确保在此期间没有其他人编辑过相同的数据。