2013-05-14 3 views
4

Я использую 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 
     } 
    } 
    } 
} 

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

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

UPDATE

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

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

UPDATE 2

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

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

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

+2

(+1) Хороший вопрос ... единственный способ, которым я вижу это, - добавить какой-то триггер на стороне базы данных. Мне тоже это не нравится, потому что он не находится под контролем программы и может быть слишком специфичным. –

+0

ли ваши обновления управления приложениями и вставки также? – Peeyush

+0

yes Peeyush. Я написал классы для обработки всего взаимодействия с базой данных. – 2013-05-14 06:18:18

ответ

3

Другая возможность использовать 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

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


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

1

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

+0

Вы можете пропустить кодировку «Timer» и «TimerTask», используя фреймворк, который обрабатывает запланированные операции, такие как [quartz] (http: // quartz-scheduler.org /) –

+0

Согласованное планирование с использованием планировщика - это путь, но поскольку OP ничего не упоминает об использовании сторонних библиотек, использование стандартных классов Java кажется хорошим вариантом! Планирование может быть реализовано позже, если OP в порядке с 3p libs! – SudoRahul

+0

FYI, я сам являюсь пользователем кварца! :) – SudoRahul

1

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

Timer timer = new Timer("runInBG"); 

    //Taking an instance of class contains your repeated method. 
    MyClass t = new MyClass(); 

    timer.schedule(t, 0, 2000); 
+0

Извините, я не могу использовать таймер. См. Мой обновленный вопрос. – 2013-05-14 17:20:03

0

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

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

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

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

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

0

UPDATE 2

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

Смежные вопросы