java - 定期扫描数据库表以查找新行
问题描述
我有一个 Java 应用程序,它从表 A 中读取行并将这些行写入表 B。
现在,我的另一个要求是定期(每 x 分钟)检查表 A 中是否有新插入的行并将它们移动到表 B。如果有帮助,表 A 具有created_at
和updated_at
TIMESTAMP 字段。
有什么方法可以根据 TIMESTAMP 值在一定间隔内检查新插入的行,将这些新行添加到 List 并重新使用我已经拥有的 Java 方法来写入表 B?
我是 Java/MySQL 新手,非常感谢任何可以帮助我入门的建议/建议。我正在使用 MariaDB 数据库。
解决方案
方法 1:一种方法是您可以通过添加一个额外的列来指示状态为活动或已处理。从表 A 中选择行并将其发送到表 B 后,您可以将列的状态更新为已处理。这可以使用简单的更新 SQL 查询来完成。您可以在每 X 分钟后通过简单的选择查询(如select * from order_book where status = ' OPEN'
.
方法2:您可以使用触发器,一旦将记录插入表A,就将记录发送到表B。这种方法的好处是它不需要您保持打开连接来读取表。这将由 DBMS 直接完成
CREATE TRIGGER trigger_UpdateTableB ON TableA
FOR INSERT AS
BEGIN
INSERT INTO
TableB
(
primary_column,
column_tableA
)
SELECT
primary_column,
column_tableB,
FROM
INSERTED
END
方法 3:你也可以使用 Apache Camel 轻松实现类似的事情。
<route>
<!--To set up a route that generates an event every 60 seconds -->
<from uri="timer://foo?fixedRate=true&period=60000" />
<to uri="sqlComponent:{{sql.selectTableA}}" />
<to uri="sqlComponent:{{sql.updateStatus}}" />
<to uri="sqlComponent:{{sql.InsertTableB}}" />
</route>
方法四:也可以在java中使用ScheduledExecutorService创建一个Scheduled Job。您可以将计划作业配置为每小时运行一次(根据用例)并从表 A 中提取新记录并将它们插入到表 B 中。
附录- https://mariadb.com/kb/en/library/trigger-overview/阅读有关 MariaDB 中触发器的更多信息
http://camel.apache.org/getting-started.html了解更多关于 Apache Camel
https://mkyong.com/java/java-scheduledexecutorservice-examples/
推荐阅读
- vue.js - 如何正确初始化 Vuex 状态以避免额外的 API 调用
- javascript - 让谷歌地图上的标记从数据库中显示的问题?
- nginx - 如何使用 nginx-buildpack 在 Cloud Foundry 中启用 HTTP2?
- java -
TestRunner [Junit] D:\Java\JDK-14.0.1\bin\javaw.exe - c++ - 非类型模板参数不能有类型
- c# - 幂和斐波那契的 C# 小数精度改进
- javascript - 在反应中动态地从集合内的firebase集合中获取数据
- prolog - 如何在prolog中返回小于或等于输入值的所有事实
- mysql - 如何对每列使用 mysql IN 函数或如何在列上使用 MAKE_SET()
- python - 有没有办法只输出这个 if 语句中的第一个元素,Django 模板?