当前位置: 首页 > 面试题库 >

无限循环数据库检查

孟俊发
2023-03-14
问题内容

我正在使用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
       }
     }
    }
}

我认为这不是最好的方法。

我在想的另一种方法是反向操作,以保持对数据库的迭代。

更新

感谢您提供有关计时器的反馈,但我认为它不能解决我的问题。一旦数据库中发生更改,我需要立即针对更改的值(示例代码中的“ el”)处理结果。

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

更新2

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

关于定期的“计时器”答案,很抱歉,但这根本不对。没有人回答使用计时器解决这种特殊情况的原因。

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


问题答案:

另一种可能性是使用ScheduledThreadPoolExecutor

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

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

上面的代码ScheduledThreadPoolExecutor在其池中创建一个具有10个线程的线程,并对其进行了Runnable注册,该注册将在5秒内立即开始运行。

要安排可运行时间,可以使用:

scheduleAtFixedRate

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

scheduleWithFixedDelay

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

And
here
you can see the advantages of ThreadPoolExecutor, in order to see if it fits
to your requirements. I advise this question: Java Timer vs
ExecutorService? too in order to
make a good decision.



 类似资料:
  • 我想实现一个无限循环数据集 如您所见,这里的主要挑战是方法。如果我在那里放一个足够大的数字,比如1 如果我在那里放一个小数字,比如1或BATCH_SIZE,训练循环中采样的“数据”将定期重复。这不是我想要的,因为我想产生新的数据 我猜过度使用内存的罪魁祸首是堆栈中的某个地方,缓存了一堆东西。随便看看Python的一面,我就不知道在哪里了。 有人能告诉我什么是实现我想要的最好的方法吗?(使用Data

  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l

  • 我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环? CircularList.Class 链接类

  • 使用具有Hibernate状态的Spring Data JPA作为提供者导致无限循环的OneTo多国关系 这里的问题不是异常的类型,而是导致这个异常的无限循环 我尝试@JsonIgnoreProperties这给了我另一个错误= 后引用的解决方案没有解决我的问题的解决方案。 一种说法是使用@ JsonManagedReference和@JsonBackReference,这确实停止了递归,但是从结

  • 基本上,findNode()搜索其数据等于作为参数插入的字符串的节点,但当我调用outputList()方法(该方法返回屏幕上当前节点的字符串表示)时,它将继续无限循环。 outputList方法是: 如有任何帮助,我们将不胜感激。提前道谢。

  • 我目前正在做一些项目euler问题,并使用长数据类型为for循环获取无限循环。我通常使用整数,对这种数据类型没有太多经验。?有人能建议如何解决这个问题吗? 问题是:13195的质因数是5、7、13、29,600851475143数最大的质因数是多少?