首页 > 解决方案 > 定期扫描数据库表以查找新行

问题描述

我有一个 Java 应用程序,它从表 A 中读取行并将这些行写入表 B。

现在,我的另一个要求是定期(每 x 分钟)检查表 A 中是否有新插入的行并将它们移动到表 B。如果有帮助,表 A 具有created_atupdated_atTIMESTAMP 字段。

有什么方法可以根据 TIMESTAMP 值在一定间隔内检查新插入的行,将这些新行添加到 List 并重新使用我已经拥有的 Java 方法来写入表 B?

我是 Java/MySQL 新手,非常感谢任何可以帮助我入门的建议/建议。我正在使用 MariaDB 数据库。

标签: javamysql

解决方案


方法 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/


推荐阅读