Чтение данных из таблицы MySQL при изменении таблицы

У меня есть база данных MySQL, которая содержит таблицу, в которую сбрасываются новые данные. Теперь я сделал Java-программу для чтения данных таблицы. Природа данных, вставленных в таблицу, такова, что иногда они постоянно добавляются, а иногда добавляются через определенные промежутки времени. Мое требование - читать данные из java-приложения, как только они добавляются в таблицу.

Как только новые данные будут добавлены в таблицу, мне нужно будет прочитать их через мою Java-программу и обработать. Также мне нужно читать только новые строки ..

Вот мой код класса Java ..

private void Readdata(ResultSet resultSet) throws SQLException {

  while (resultSet.next()) {
  Date date = resultSet.getDate("datum");
  String comment = resultSet.getString("comments");   

}
}

В этом коде, если условие while не выполняется, оно выходит и перестает читать.


person user3617097    schedule 15.05.2014    source источник
comment
ResultSet не обновляется автоматически при поступлении новых данных (это было бы неэффективно и опасно по многим причинам). В вашем случае я бы запомнил последний полученный идентификатор, а затем периодически запускал бы новое чтение, начиная с этого идентификатора (для пакета, скажем, 500-1000 записей, потому что одновременное чтение большого количества записей также не рекомендуется).   -  person Ashalynd    schedule 15.05.2014


Ответы (3)


Вы можете создать задание cron и настроить его для периодической проверки базы данных по своему желанию. Вы можете использовать quartz-2.2.0.jar или аналогичную библиотеку, которая работает с выражениями cron. Создайте задание и вставьте в него код чтения данных. Вы также можете использовать Trigger в mysql.

person Ninad Pingale    schedule 15.05.2014

Как насчет использования задачи таймера и ScheduledExecutorService для регулярной проверки обновлений? Вам необходимо расширить java.util.TimerTask. Вам также понадобится анонимный внутренний класс run. Затем вам нужно установить java.util.concurrent.ScheduledExecutorService. (для получения дополнительной информации http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html).

scheduleAtFixedRate(timerTask, 0, 4, TimeUnit.HOURS); = scheduleAtFixedRate(Runnable command, long delay,long time, TimeUnit unit)


public class MyClass extends TimerTask{

public void StartScheduledCheck(){
 TimerTask timerTask ;
        ScheduledExecutorService scheduledExecutorService =
        Executors.newScheduledThreadPool(5);
         Timer timer = new Timer(true);
         timerTask = new MyClass();
          ScheduledFuture scheduledFuture = 

scheduledExecutorService.scheduleAtFixedRate(timerTask, 0, 4, TimeUnit.HOURS);
    }


     public void run(){
            //Call sql class here  
        }

    }

Это будет делать эту задачу каждые четыре часа. Вы можете изменить его на секунды или минуты.

person John Hogan    schedule 15.05.2014

Попробуй это:

Вы получаете данные один раз из таблицы mysql и сохраняете их в списке. теперь вы проверяете, есть ли в таблице элемент с идентификатором длины вашего списка. Если да, у вас есть новый предмет. Если нет, значит в таблице нет нового элемента. Кодировка, стоящая за этим, довольно проста. И если вы хотите зацикливаться вечно, используйте:

while(running){  //where running is a boolean value
//check for new entries
}

и поместите это в поток, иначе это заблокирует вашу основную программу.

person PKlumpp    schedule 15.05.2014