如何通过java监听新的db记录

时间:2013-08-15 19:49:34

标签: java mysql database multithreading

目前我使用while(true)Thread.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从应用程序执行,一些不是。

6 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

没有内置"更新监听器"在MySQL(或我所知道的任何SQL数据库)中,所以你必须建立自己的。

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

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

答案 2 :(得分:2)

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

答案 3 :(得分: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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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