опрос базы данных с использованием Java - PullRequest
5 голосов
/ 27 февраля 2010

Я застрял в какой-то момент, когда мне нужно получить изменения базы данных в коде Java. Запрос - обновить, добавить, удалить любую запись в любой таблице БД; должен быть распознан программой Java. Как это может быть реализовано JMS? или поток Java?

Обновление: Спасибо, ребята, за вашу поддержку. Я на самом деле использую Oracle в качестве базы данных и семинара по Weblogic 10.3. На самом деле я хочу получить обновления из таблицы, в которой у меня есть только разрешение на чтение, так что, ребята, что вы все предлагаете. Я не могу обновить БД. Единственное, что я могу сделать, это просто прочитать БД, и если в таблице есть какие-либо изменения, я должен получить информацию / уведомление о том, что определенные строки данных были добавлены / удалены или обновлены.

Ответы [ 7 ]

8 голосов
/ 27 февраля 2010

Если база данных не может отправить сообщение на Java, у вас должен быть поток, опрашивающий.

Лучшая, более эффективная модель - это модель, которая генерирует события при изменениях. База данных, в которой работает Java (например, Oracle), может это сделать.

6 голосов
/ 27 февраля 2010

Мы делаем это путем опроса БД с помощью задачи таймера EJB. По сути, у нас есть поле состояния, которое мы обновляем, когда обрабатываем эту строку.

Таким образом, поток таймера EJB вызывает процедуру, которая захватывает строки, помеченные как «необработанные».

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

Недостатком является бесполезная нагрузка на БД, а также время отклика будет ограничено (возможно, потребуется несколько секунд).

3 голосов
/ 27 февраля 2010

Мы достигли этого в нашей фирме, добавив в таблицы базы данных триггеры, которые вызывают исполняемый файл для выдачи сообщения Tib Rendezvous, получаемого всеми заинтересованными Java-приложениями.

Тем не менее, идеальный способ сделать это IMHO - это полностью контролировать все записи в базу данных на уровне приложения и уведомлять любые заинтересованные стороны на этом этапе (через мульти-приведение, Tib и т. Д.). В действительности это не всегда возможно, когда у вас есть несколько разрозненных систем.

2 голосов
/ 28 февраля 2010

Вы действительно зависите от того, поддерживает ли соответствующая база данных.Вы также должны принять во внимание накладные расходы.Много вставок / обновлений также означает большое количество уведомлений, и ваш Java-код должен обрабатывать их последовательно, иначе он будет пузыриться.

Если модель данных позволяет это сделать, просто добавьте дополнительный столбец, содержащий метку времени, которая получаетобновляется при каждой вставке / обновлении.Большинство основных БД поддерживает автоматическое обновление столбца при каждой вставке / обновлении.Я не знаю, какой сервер БД вы используете, поэтому приведу только пример для MySQL:

CREATE TABLE mytable (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    somevalue VARCHAR(255) NOT NULL,
    lastupdate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX (lastupdate)
)

Таким образом, вам не нужно беспокоиться о вставке / обновлении * 1006.* сам.Вы можете просто сделать INSERT INTO mytable (somevalue) VALUES (?) или UPDATE mytable SET somevalue = ? WHERE id = ?, и БД сделает волшебство.

Убедившись, что время сервера БД и время приложения Java одинаковы, вы можете просто запустить фоновый поток (используялибо Timer с TimerTask, либо ScheduledExecutorService с Runnable или Callable) что примерно так:

Date now = new Date();
statement = connection.prepareStatement("SELECT id FROM mytable WHERE lastupdate BETWEEN ? AND ?");
statement.setDate(1, this.lastTimeChecked);
statement.setDate(2, now);
resultSet = statement.executeQuery();
while (resultSet.next()) {
    // Handle accordingly.
}
this.lastTimeChecked = now;

Обновление : согласно обновлению вопроса выясняется, что у вас нет контроля над БД.Ну, тогда у вас не так много хороших / эффективных вариантов.Либо просто обновите весь список в памяти Java всеми данными из БД без проверки / сравнения изменений (вероятно, самый быстрый способ), либо динамически сгенерируйте запрос SQL на основе текущих данных, который исключает текущие данные из результатов.

1 голос
/ 27 февраля 2010

Альтернативный способ сделать это - направить все вызовы базы данных через API веб-службы или, возможно, JMS API, который выполняет фактические вызовы базы данных. Процессы могут зарегистрироваться там, чтобы получить уведомление об обновлении базы данных.

1 голос
/ 27 февраля 2010

Я предполагаю, что вы говорите о ситуации, когда все может обновить таблицу. Если по какой-то причине вы вместо этого говорите о ситуации, когда только Java-приложение будет обновлять таблицу, это не так. Если вы используете только Java, вы можете поместить этот код в ваш DAO или EJB, выполняя обновление (в этом случае это намного чище, чем использование триггера).

0 голосов
/ 07 апреля 2010

У нас аналогичное требование. В нашем случае у нас есть устаревшая система, которая не хочет негативно влиять на производительность существующей таблицы транзакций.

Вот мое предложение:

  1. Новая рабочая таблица с pk для транзакции и вставкой метки времени
  2. Новая таблица аудита, которая имеет те же столбцы, что и таблица транзакций + столбцы аудита
  3. Запуск таблицы транзакций для сброса всех вставок / обновлений / удалений в таблицу аудита
  4. Java-процесс для опроса рабочей таблицы, присоединения к таблице аудита, публикации рассматриваемого события и удаления из рабочей таблицы.

Вопрос: что вы используете для опроса? Является ли кварц излишним? Как вы можете уменьшить частоту опроса на основе текущей загрузки БД?

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