我正在使用 JDBC,需要不断检查数据库是否有更改的值。
我目前拥有的是一个无限循环运行,内部循环迭代不断变化的值,并且每次迭代都会检查数据库。
public void runInBG() { //this method called from another thread
while(true) {
while(els.hasElements()) {
Test el = (Test)els.next();
String sql = "SELECT * FROM Test WHERE id = '" + el.getId() + "'";
Record r = db.getTestRecord(sql);//this function makes connection, executeQuery etc...and return Record object with values
if(r != null) {
//do something
}
}
}
}
我认为这不是最好的方法。
我想到的另一种方法是相反的,继续迭代数据库。
UPDATE
感谢您有关计时器的反馈,但我认为这不能解决我的问题。
一旦数据库中发生更改,我需要几乎立即根据更改的值(示例代码中的“els”)处理结果。
即使数据库没有更改,它仍然必须不断检查更改的值。
UPDATE 2
好的,对于任何对答案感兴趣的人,我相信我现在有了解决方案。基本上解决方案不是为此使用数据库。仅将需要的内容从数据库加载到内存中、更新、添加等。
这样,您就不必不断打开和关闭数据库,只需在对数据库进行更改时才处理数据库,并将这些更改反映回内存中,并且只处理当时内存中的任何内容。
当然,这会占用更多的内存,但性能在这里绝对是关键。
至于定期的“计时器”答案,我很抱歉,但这根本不正确。没有人回答使用计时器如何解决这种特殊情况的原因。
但再次感谢您的反馈,它仍然很有帮助。
另一种可能性是使用ScheduledThreadPoolExecutor.
你可以实施一个Runnable
包含你的逻辑并将其注册到ScheduledExecutorService
如下:
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
executor.scheduleAtFixedRate(myRunnable, 0, 5, TimeUnit.SECONDS);
上面的代码创建了一个ScheduledThreadPoolExecutor
其池中有 10 个线程,并且会有一个Runnable
注册到它将立即开始在 5 秒内运行。
要安排您的可运行程序,您可以使用:
固定费率安排
创建并执行一个周期性操作,该操作首先在给定的初始延迟后启用,然后在给定的时间段内启用;也就是说,执行将在initialDelay之后开始,然后是initialDelay+period,然后是initialDelay + 2 * period,依此类推。
固定延迟调度
创建并执行一个周期性操作,该操作在给定的初始延迟后首先启用,然后在一次执行终止和下一次执行开始之间具有给定的延迟。
And here你可以看到的优点ThreadPoolExecutor
,以查看它是否符合您的要求。我建议这个问题:Java Timer 与 ExecutorService?也是为了做出正确的决定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)