每5秒用java扫描一个表sql

Posted

技术标签:

【中文标题】每5秒用java扫描一个表sql【英文标题】:Scanning a table sql with java every 5 second 【发布时间】:2017-10-05 07:19:43 【问题描述】:

谁能帮帮我,如何在java中创建一个函数,每5秒扫描一次,以了解mysql表中是否存在输入的新数据。

【问题讨论】:

假设您可以使用 mysql 触发器作为解决方案。分享您尝试过的方法可能会有所帮助。 @Rajith - 触发器将如何解决这个问题? @adjieq - 到目前为止尝试过什么? @RajithPemabandu 我已经尝试过了,但是我在使用 sql 语言处理任何传入数据时遇到了麻烦,我是编程语言的初学者,如果可以在 java 中完成会更容易 是否可以调用 Web 服务或存储过程作为 XMLRPC 请求并将其用作触发器。参考这个post 【参考方案1】:

如果你只需要java解决方案,你可以使用java提供的timer & timer task。

这里是代码。

    java.util.TimerTask task = new java.util.TimerTask() 
        int prevCount = 0; // you can declare it static
        @Override
        public void run() 
            Connection conn = getConnection();
            try 
                ResultSet rs = conn.prepareStatement("Select Count(*) from table").executeQuery();
                int count = rs.getInt(1);
                System.out.println("Count diff:"+ (prevCount-count));
             catch (Exception e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
        
    ;
    java.util.Timer timer = new java.util.Timer(true);// true to run timer as daemon thread
    timer.schedule(task, 0, 5000);// Run task every 5 second
    try 
        Thread.sleep(60000); // Cancel task after 1 minute.
     catch (InterruptedException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    
    timer.cancel();

【讨论】:

最初我在运行它时遇到错误,然后我尝试在“while”循环中输入int count = rs.getInt (1); 并且不再有错误,我不明白为什么会这样。但是,非常感谢,您提供的代码对我解决这个问题很有帮助。【参考方案2】:

在大表中进行搜索(尤其是在大表中)是一项繁重的操作。因此,您可能可以通过以其他方式检测新数据来减少表读取量。

例如,您可以在实际获取数据之前检查表的大小。为此,您可以执行“从表中选择计数(*)”操作,甚至可以计算磁盘上的表大小,如下所示:How to get the sizes of the tables of a mysql database?

带有数据库触发器的变体也可以提供帮助。例如,如果您的触发器将更新您的 Java 应用程序将查看的最后一个表的更新的某个标记,该怎么办。该变体还有助于避免对表执行空闲读取。

【讨论】:

感谢您的回答。基本问题是我尝试对收件箱表上的每条传入消息进行自动回复,我有限制,因为我必须先处理传入的数据,然后再将其发回,我认为如果通过 java 完成会更容易。【参考方案3】:

您不需要 java 程序来扫描 DB 中的更改,除了冗余之外,网络和 DB 的成本很高,实现已作为标准解决方案提供的功能并不是一个好习惯。

CREATE TRIGGER `some_update_happened` BEFORE/AFTER INSERT/UPDATE/DELETE
ON `mydb`.`mytable`
FOR EACH ROW BEGIN
    // your code here for db trigger calling java function
END;

您可以使用数据库更新触发器参考 this link 和 this link 。 实现触发器后,我想您需要使用在 php、java 等中实现的服务来捕获触发器。您需要实现事件侦听器以接收触发器自动化。就像完成here for PHP 一样,在 oracle 文档中也有一个example,但那是针对 Oracle 的。这是java+mysql 中的一个示例。

我知道你是一个初学者,一步一步走,一个错误一个错误,你就会到达那里。祝你好运。

【讨论】:

谢谢你的建议,我认为使用触发器会更有效,我确实需要了解更多关于触发器的信息 触发器不会是什么大问题,它真的很简单。完成后请分享您的经验。

以上是关于每5秒用java扫描一个表sql的主要内容,如果未能解决你的问题,请参考以下文章

SQL中的表扫描和索引扫描

是否可以分析 SQLite SQL 查询?

索引的访问-SQL Server

每 X 秒用 mysql 数据更新 google java map

优化 SQL 查询以避免全表扫描

SQL 数据优化索引建suo避免全表扫描