проверка базы данных бесконечного цикла

Я использую JDBC, нужно постоянно проверять базу данных на изменение значений.

То, что у меня есть в настоящее время, – это бесконечный цикл, внутренний цикл, повторяющий переменные значения, и каждая итерация, проверяющая базу данных.

public void runInBG() { //this method called from another thread while(true) { while(els.hasElements()) { Test el = (Test)els.next(); String sql = "SELECT * FROM Test WHERE id = '" + el.getId() + "'"; Record r = db.getTestRecord(sql);//this function makes connection, executeQuery etc...and return Record object with values if(r != null) { //do something } } } } 

Я думаю, что это не лучший способ.

Другой способ, о котором я думаю, – это обратное, чтобы продолжить перебирать базу данных.

ОБНОВИТЬ

Спасибо за отзывы о таймерах, но я не думаю, что это решит мою проблему. Как только изменение происходит в базе данных, мне нужно обрабатывать результаты почти мгновенно против изменяющихся значений («els» из кода примера).

Даже если база данных не изменяется, она все равно должна постоянно проверять переменные значения.

ОБНОВЛЕНИЕ 2

Хорошо, всем, кто интересуется ответом, я считаю, что у меня есть решение сейчас. В основном решение НЕ использовать базу данных для этого. Загружайте, обновляйте, добавляйте и т. Д. Только то, что нужно от базы данных к памяти. Таким образом, вам не нужно постоянно открывать и закрывать базу данных, вы имеете дело только с базой данных, когда вы вносите в нее изменения, и отражаете эти изменения в памяти и занимаетесь только тем, что находится в памяти в то время. Уверен, что это более интенсивный объем памяти, но производительность здесь является абсолютной.

Что касается периодических ответов «таймер», извините, но это совсем не так. Никто не ответил по какой-то причине, как использование таймеров решит эту конкретную ситуацию.

Но еще раз спасибо за отзывы, но все равно было полезно.

Другая возможность – использовать ScheduledThreadPoolExecutor .

Вы можете реализовать Runnable содержащий вашу логику, и зарегистрировать его в ScheduledExecutorService следующим образом:

 ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10); executor.scheduleAtFixedRate(myRunnable, 0, 5, TimeUnit.SECONDS); 

В приведенном выше коде создается ScheduledThreadPoolExecutor с 10 потоками в пуле и будет иметь зарегистрированный на нем Runnable который будет запускаться через 5 секунд, начиная с момента запуска.


Чтобы запланировать выполнение, вы можете использовать:

scheduleAtFixedRate

Создает и выполняет периодическое действие, которое активируется сначала после заданной начальной задержки, а затем с заданным периодом; то есть казни начнутся после initialDelay, затем initialDelay + period, затем initialDelay + 2 * period и т. д.

scheduleWithFixedDelay

Создает и выполняет периодическое действие, которое активируется сначала после заданной начальной задержки, а затем с указанной задержкой между окончанием одного выполнения и началом следующего.


И здесь вы можете увидеть преимущества ThreadPoolExecutor , чтобы убедиться, что он соответствует вашим требованиям. Я советую этот вопрос: Java Timer vs ExecutorService? чтобы принять правильное решение.

Сохранение while(true) в runInBG() – плохая идея. Вам лучше удалить это. Вместо этого вы можете иметь планировщик / таймер (используйте Timer & TimerTask ), который будет периодически вызывать runInBG() и проверять наличие обновлений в БД.

u может использовать таймер —>

 Timer timer = new Timer("runInBG"); //Taking an instance of class contains your repeated method. MyClass t = new MyClass(); timer.schedule(t, 0, 2000); 

Как вы сказали в приведенном выше комментарии, если приложение управляет обновлениями и вставками, вы можете создать фреймворк, который уведомляет поток «BG» или процесс об изменении в базе данных. Уведомление может осуществляться через сеть через JMS или внутреннюю виртуальную машину с использованием шаблона наблюдателя или как локальных, так и удаленных уведомлений.

У вас может быть общее сообщение уведомления (оно может быть классом для локального уведомления или текстового сообщения для удаленных уведомлений)

 <Notification> <Type>update/insert</Type> <Entity> <Name>Account/Customer</Name> <Id>id</Id> <Entity> </Notification> 

Чтобы избежать «цикла занятости», я бы попытался использовать триггеры. H2 также поддерживает API DatabaseEventListener , таким образом вам не нужно создавать триггер для каждой таблицы.

Это может не всегда работать, например, если вы используете удаленное соединение.

ОБНОВЛЕНИЕ 2

Хорошо, всем, кто интересуется ответом, я считаю, что у меня есть решение сейчас. В основном решение НЕ использовать базу данных для этого. Загружайте, обновляйте, добавляйте и т. Д. Только то, что нужно от базы данных к памяти. Таким образом, вам не нужно постоянно открывать и закрывать базу данных, вы имеете дело только с базой данных, когда вы вносите в нее изменения, и отражаете эти изменения в памяти и занимаетесь только тем, что находится в памяти в то время. Уверен, что это более интенсивный объем памяти, но производительность здесь является абсолютной.