【问题标题】:Database Polling and Scheduling in SpringbootSpring Boot 中的数据库轮询和调度
【发布时间】:2020-08-08 15:03:08
【问题描述】:

我需要对其中一个 DB 表(比如 T1)执行轮询操作并更新另一个 DB 表(比如 T2)的状态。只要表 T2 中有插入,就必须安排此作业。

我知道 Quartz 调度程序,但它提供了基于时间的调度和轮询。 有没有其他库可以方便地处理这种情况?

【问题讨论】:

  • 你能指定数据库是如何更新的吗?插入是来自您的应用程序还是来自其他来源?
  • Quartz 允许您动态创建作业并“现在”执行它。不知道为什么需要使用“轮询方法”来执行此操作,我的意思是,为什么不更新更新第一个表的请求“内部”的第二个表?另一方面,也许您可​​以使用数据库触发器来管理这种情况。
  • 我不清楚您要解决的问题以及解决方案的任何限制。一般来说,轮询不是一个理想的解决方案,因为它经常浪费资源。我会首先尝试基于事件的解决方案。您是否考虑过在 T1 上添加 SQL 插入触发器?它可以更新 T2。这将避免运行任务调度程序的额外工作/复杂性。如果一定要使用轮询,我相信 Quartz 有丰富的功能集和多种调度模式。如果你不喜欢 Quartz,Java 有几个可能工作的线程池执行器,例如 ScheduledThreadPoolExecutor。
  • @dotore 是的,触发器可以是解决方案之一,但数据库不在我的控制之下,而且相同的表用于多种目的,所以我想到了创建一个通用的轮询机制。
  • @devdanke 是的,你是对的。所以我想要实现的是,一旦在 T2 中插入了一行,我需要检查状态列是否有 T1 表中的任何更改并继续检查 1 分钟,如果在该列中检测到任何更改,那么我会需要更新T2中插入行的值。

标签: java spring spring-boot polling


【解决方案1】:

原则上有两种方法可以解决您的问题:

  1. 发生更改时立即获得通知: 这意味着要么是数据库告诉您有关更改(通过数据库触发器),要么是进行更改的应用程序告诉您有关更改。 您说触发器不是一种选择,因为数据库不在您的控制之下。您还说更改源于我们的应用程序。因此,一个可能的解决方案可能是让进行更改的代码通知其他模块有关更改。一种可能性是允许注册回调/处理程序方法。这种模式很常见,例如当您在 UI 按钮上注册 onClick 处理程序时。您是在说“无论何时发生这种情况,请给我打电话”(例如参见 https://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html#setAction(javax.swing.Action))。

  2. 投票改变: 此方法效率较低/资源密集,但可以在选项 1) 不可行时应用(数据库触发器不可能,更改通过您无法控制的另一个(部分)应用程序发生)。您只需定期寻找变化。您可以为此使用 Quartz,也可以使用 java.util.TimerTask / java.util.concurrent.ScheduledExecutorService 等内置类。

【讨论】:

  • 我想澄清一下这个解决方案 - 当在表上发生插入时我可以采用类似的方法,从而导致我的 Java 框架或函数被调用?不幸的是,我无法提出解决方案,但我决定在 MySQL 中使用触发器,但我现在想从触发器中调用我的 Java 函数,这可能吗?请你给我一些文章吗?
  • 触发器是数据库引擎内部的一个事件。因此,您可以从那里与您的 Java 进程进行通信。假设您的应用程序有一个 Web 服务接口(例如,通过 JAX-RS),这可以通过运行像 curl 或 wget 这样的 HTTP 客户端来完成。使用 MySQL,似乎可以使用 sys_exec 用户定义函数 (crazytechthoughts.blogspot.com/2011/12/…)。因此触发器启动一个进程并运行 curl,curl 向您的 Java 服务发出 HTTP 请求,最后一个 REST 端点可以调用您的事件处理程序。
  • 感谢您的回复,我会立即调查。我没有网络服务接口,但如果它需要我添加一个,我会这样做
  • 也许可以看看这个答案:stackoverflow.com/a/11041018/13791091。它建议使用命名管道作为一种通信方式。
猜你喜欢
  • 2013-08-21
  • 1970-01-01
  • 2015-10-21
  • 2021-05-04
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2014-02-16
相关资源
最近更新 更多