无限循环数据库检查(infinite loop database check)

2019-09-03 00:40发布

我使用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”)几乎在瞬间处理结果。

即使数据库不改变它仍具有对变化值不断检查。

更新2

OK,到任何有兴趣的答案,我相信我现在有解决方案。 基本上解决方案是不使用数据库来实现此。 加载,更新,增加,等等。从数据库中存储只需要什么。 这样,你不必打开并不断关闭数据库,你只有当你改变它处理数据库,并反映这些更改回内存,而只处理无论是在内存中的时间。 当然这更是占用大量内存但性能是绝对的关键在这里。

至于周期性的“计时器”的答案,我很抱歉,但这是不正确的。 没有人回应的理由如何使用定时器将解决这个特殊情况。

但是,再次感谢大家的反馈,它仍然是有帮助的还是。

Answer 1:

另一种可能是使用ScheduledThreadPoolExecutor

你可以实现一个Runnable包含你的逻辑和它注册到ScheduledExecutorService ,如下所示:

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
executor.scheduleAtFixedRate(myRunnable, 0, 5, TimeUnit.SECONDS);

上面的代码,创建ScheduledThreadPoolExecutor在其池10个线程,并且将有一个Runnable注册它,将在5秒时期立即启动运行。


要安排您可运行,你可以使用:

scheduleAtFixedRate

创建并执行一个给定的初始延迟之后第一启用的定期操作,随后与给定的周期; 即在initialDelay后执行将开始接着在initialDelay +时段,则在initialDelay + 2 *周期,依此类推。

scheduleWithFixedDelay

创建并执行一个第一给定的初始延迟之后,并随后用一个执行的终止和下一开始之间的给定延迟启用的定期操作。


而在这里 ,你可以看到的好处ThreadPoolExecutor ,为了看它是否符合您的要求。 我建议这个问题: Java的定时器VS ExecutorService的? 也为了使一个很好的决定。



Answer 2:

保持while(true)runInBG()是一个坏主意。 你最好删除。 相反,你可以(使用有计划/定时器 定时器和TimerTask的 ),它会调用runInBG()定期并为您在数据库的更新。



Answer 3:

ü可以使用计时器--->

Timer timer = new Timer("runInBG");

    //Taking an instance of class contains your repeated method.
    MyClass t = new MyClass();

    timer.schedule(t, 0, 2000);


Answer 4:

当您在评论上面说,如果应用程序控制更新和插入,那么你可以创建一个框架,它为通知“BG”线程或进程有关数据库的变化。 通知可使用观察者模式或本地和远程的通知结束了通过JMS或帧内VM网络。

你可以有像通用通知消息(它可以是本地通知或远程通知短信类)

<Notification> 
  <Type>update/insert</Type>
  <Entity>
     <Name>Account/Customer</Name>
     <Id>id</Id>
  <Entity> 
</Notification>


Answer 5:

为了避免“忙循环”,我会尝试使用触发器。 H2还支持DatabaseEventListener API,这样你就不必为每个表的触发器。

这可能并不总是有效,例如,如果您使用的远程连接。



Answer 6:

更新2

OK,到任何有兴趣的答案,我相信我现在有解决方案。 基本上解决方案是不使用数据库来实现此。 加载,更新,增加,等等。从数据库中存储只需要什么。 这样,你不必打开并不断关闭数据库,你只有当你改变它处理数据库,并反映这些更改回内存,而只处理无论是在内存中的时间。 当然这更是占用大量内存但性能是绝对的关键在这里。



文章来源: infinite loop database check
标签: java sql jdbc h2