2

目前我使用while(true)andThread.sleep()来检查数据库中的新记录并执行 java 代码。

这是一个例子:

public class StartCommands implements Runnable{
  private Active_Job activeJob;
  Runnable execute_command;

  public StartCommands(){
     activeJobs = new Active_Job();
  }

  @Override
  public void run(){
    int jobId = 0;

    while(true){
      //access the db and get one row from the table by the status
      jobId = activeJobs.get(Status.NEW);
      if (jobId > 0){
        activeJob.updateStatus(Status.INIT);
        execute_command = activeJob.getCommand();

        new Thread(execute_command).start();

        activeJob = new Active_Job();
        jobId = 0;
      }

      Thread.sleep(10*1000);
    } 
  }
}

我在代码中很少有地方使用这种方法。但我不喜欢无限循环,每 10 秒检查一次新行。

所以我正在寻找的是某种监听器:一旦输入新记录 - 执行 java 代码。有些是insert从应用程序执行的,有些不是。

4

6 回答 6

3

MySQL(或我知道的任何 SQL 数据库)中没有内置的“更新侦听器”,因此您必须构建自己的。

请注意,在您的实现中,如果添加了两个新行,您将处理一个,等待 10 秒,然后处理下一个。您的代码每 10 秒不能处理一个以上的事件。

您要做的是将数据库的轮询与工作线程的分派分开。让轮询循环每 n 秒唤醒一次,从数据库中读取所有新记录,并将它们添加到工作队列中。有一个消费者线程在队列中等待,并在消息出现在队列中时启动处理器。使用线程池实现。

于 2013-08-15T19:58:24.733 回答
3

您使用的技术称为轮询。您正在检查新记录,等待一段时间,然后再次检查新记录。响应新记录的一种好方法可能是创建一个控制器来处理将新记录插入数据库并强制所有客户端(更新数据库记录的客户端)使用该控制器来执行此操作。然后控制器可以在有新记录时提醒您。为了便于控制器发出警报,您可以设置一个网络服务,控制器可以在其中与您联系。

我说这“可能”是一个很好的方法,因为创建控制器和 Web 服务显然是额外的工作。但是,这将使轮询变得不必要。如果您想继续使用您的轮询技术,您可以创建一个服务(生产者)来执行轮询并用新结果填充队列。然后,您的其他程序(消费者)可以从队列中检索项目并对其进行处理。

于 2013-08-15T19:54:34.093 回答
2

@nir,由于目前java中没有mysql数据库更新监听器,所以你可以做的是,针对你想监听的表创建一个数据库更新触发器。在触发器语句或代码中构造一个函数。现在从该函数中调用 java 函数。Java 函数应该能够修改一些文本,比如“a”。现在针对“a”中的更改注册侦听器。并在实现“a”的文本更改侦听器的类中,放置您要执行的代码。

于 2015-02-09T03:52:32.687 回答
1

条件接口可以很好地满足您的需求。它将为您提供所需的细粒度控制,并避免不断旋转线程的问题。

http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html

于 2013-08-15T19:53:41.413 回答
0

在 oracle 中存在称为数据库更改通知http://docs.oracle.com/cd/E11882_01/java.112/e16548/dbchgnf.htm的东西,我只是实现了一个像你这样的组件在 mysql 中有类似的东西还是你用什么方法到达的?

于 2013-11-26T16:51:41.007 回答
0

使用触发器,调用用户定义的函数,该函数使用 sys_exec() 来运行一个外部应用程序,该应用程序发出进程间信号量的信号。您的侦听器线程可以等待,并在收到信号时处理新记录。

于 2013-08-16T10:32:33.170 回答