Java 无限循环数据库检查

Java 无限循环数据库检查,java,sql,jdbc,h2,Java,Sql,Jdbc,H2,我使用的是JDBC,需要不断检查数据库是否有变化的值 我现在有一个无限循环在运行,内部循环在一个不断变化的值上迭代,每次迭代都要检查数据库 public void runInBG() { //this method called from another thread while(true) { while(els.hasElements()) { Test el = (Test)els.next(); String sql = "SELECT * F

我使用的是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
       }
     }
    }
}
我觉得这不是最好的办法

我认为的另一种方法是相反的,不断迭代数据库

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
       }
     }
    }
}
更新

感谢您对计时器的反馈,但我认为这不会解决我的问题。 一旦数据库中发生更改,我几乎需要立即根据更改的值(示例代码中的“els”)处理结果

即使数据库没有改变,它仍然必须不断地检查不断变化的值

更新2

好的,对于任何对答案感兴趣的人,我相信我现在有了答案。基本上,解决方案是不为此使用数据库。加载、更新、添加等。。。只需要从数据库到内存所需的内容。 这样,您就不必经常打开和关闭数据库,只需在对数据库进行更改时处理数据库,并将这些更改反映回内存中,同时只处理内存中的任何内容。 当然这会占用更多内存,但性能是绝对关键

至于周期性的“计时器”回答,我很抱歉,但这根本不对。没有人回答说使用计时器可以解决这种特殊情况的原因

但是再次感谢您的反馈,尽管如此还是很有帮助。

runInBG()中保留
而(true)
是个坏主意。你最好把它拿走。相反,您可以使用一个调度程序/计时器(使用&),它将定期调用
runInBG()
,并检查数据库中的更新。

u可以使用计时器-->


另一种可能是使用

您可以实现一个包含逻辑的
Runnable
,并将其注册到
ScheduledExecutorService
,如下所示:

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
executor.scheduleAtFixedRate(myRunnable, 0, 5, TimeUnit.SECONDS);
上面的代码创建了一个
ScheduledThreadPoolExecutor
,其池中有10个线程,并向其注册了一个
Runnable
,它将在5秒内立即开始运行


要安排您的runnable,您可以使用:

创建并执行一个周期性动作,该动作在给定的初始延迟后首先启用,然后在给定的时间段内启用;也就是说,执行将在initialDelay之后开始,然后是initialDelay+period,然后是initialDelay+2*period,依此类推

创建并执行一个周期性操作,该操作在给定的初始延迟后首先启用,然后在一个执行的终止和下一个执行的开始之间具有给定的延迟



您可以看到
ThreadPoolExecutor
的优点,以查看它是否适合您的需求。我建议这个问题:也是为了做出一个好的决定。

正如您在上面的评论中所说,如果应用程序控制更新和插入,那么您可以创建一个框架,通知“BG”线程或进程数据库中的更改。通知可以通过网络通过JMS或使用观察者模式的内部VM,或者本地和远程通知

您可以使用通用通知消息,如(可以是用于本地通知的类,也可以是用于远程通知的文本消息)


更新/插入
客户/客户
身份证件

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

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

更新2


好的,对于任何对答案感兴趣的人,我相信我现在有了答案。基本上,解决方案是不为此使用数据库。加载、更新、添加等。。。只需要从数据库到内存所需的内容。这样,您就不必经常打开和关闭数据库,只需在对数据库进行更改时处理数据库,并将这些更改反映回内存中,同时只处理内存中的任何内容。当然,这会占用更多内存,但性能是这里的绝对关键。

(+1)问得好。。。我能看到的唯一方法是在数据库端添加某种触发器。我也不喜欢这样,因为它不在程序的控制之下,可能太具体了。你的应用程序也控制更新和插入吗?是的。我已经编写了处理所有数据库交互的类。嗨,Jaco,请查看更新的解决方案。你应该发布update2作为答案并接受它!您可以跳过
定时器
TimerTask
编码,方法是使用一个框架来处理调度操作,例如使用调度程序进行约定的调度,但由于OP没有提到任何关于使用第三方LIB的内容,因此使用标准java类似乎是一个不错的选择!如果OP可以使用3p LIB,则可以稍后执行调度!仅供参考,我自己就是石英的用户!:)如果手动配置
计时器
,只需添加信息就会让人头疼,因为像这样的框架已经处理了很多问题。是的,我是quartz的用户(免责声明:我与图书馆开发或任何客户支持都没有关系,只是一个快乐的用户)。这必须是不断的检查,因为当数据库发生任何变化时,结果必须被处理。我不知道用定时器怎么解决这个问题。
<Notification> 
  <Type>update/insert</Type>
  <Entity>
     <Name>Account/Customer</Name>
     <Id>id</Id>
  <Entity> 
</Notification>