Получение событий из базы данных - PullRequest
31 голосов
/ 01 мая 2009

Я не очень знаком с базами данных и тем, что они предлагают вне операций CRUD.

Мои исследования привели меня к триггерам . Похоже, что триггеры предлагают такой тип функциональности:

(из Википедия )

Обычно существует три триггерных события, которые вызывают срабатывание триггеров:

  • Событие INSERT (поскольку новая запись вставляется в базу данных).
  • Событие UPDATE (как запись изменяется).
  • Событие DELETE (поскольку запись удаляется).

Мой вопрос: есть ли какой-нибудь способ, которым я могу получать уведомления в Java (предпочтительно с данными, которые изменились) базой данных, когда запись обновляется / удаляется / вставляется с использованием какой-либо семантики триггера?

Какие могут быть альтернативные решения этой проблемы? Как я могу прослушивать события базы данных?

Основной причиной, по которой я хочу это сделать, является сценарий, подобный этому :

У меня 5 клиентских приложений, все в разных процессах / на разных ПК. Все они имеют общую базу данных (в данном случае Postgres).

Допустим, один клиент изменяет запись в БД, в которой все 5 клиентов «заинтересованы». Я пытаюсь придумать, как клиенты могут быть «уведомлены» об изменении (желательно с прикрепленными данными). ) вместо того, чтобы они запрашивали данные через некоторый интервал.

Ответы [ 12 ]

14 голосов
/ 01 мая 2009

Используя Oracle, вы можете настроить триггер для таблицы, а затем триггер отправить сообщение JMS. Oracle имеет две разные реализации JMS. Затем вы можете иметь процесс, который будет «прослушивать» сообщение с помощью драйвера JDBC. Я использовал этот метод, чтобы выдвинуть изменения в моем приложении против опроса. Если вы используете базу данных Java (H2), у вас есть дополнительные опции. В моем текущем приложении (SIEM) у меня есть триггеры в H2, которые публикуют события изменений с использованием JMX.

13 голосов
/ 06 мая 2009

Не путайте базу данных (которая содержит данные) и события в этих данных.

Триггеры - это один из способов, но обычно в вашем приложении будет постоянный слой. Этот слой может запускать события, когда происходят определенные события, например, в тему JMS.

Триггеры - это последний шаг, так как вы работаете с реляционными элементами, а не с «событиями» в данных. (Например, «обновление» может в действительности отображаться на событие «изменилось юридическое имя компании»). Если вы полагаетесь на базу данных, вам придется сопоставить вставки и обновления с реальными событиями .... Вы уже знали о!

Затем вы можете поместить другие элементы поверх этих уведомлений - например, обработку потока событий - чтобы найти события, которые интересны другим.

Джеймс

7 голосов
/ 06 мая 2009

Хм. Итак, вы используете PostgreSQL и хотите «прослушивать» события и получать «уведомления» о том, когда они происходят?

http://www.postgresql.org/docs/8.3/static/sql-listen.html http://www.postgresql.org/docs/8.3/static/sql-notify.html

Надеюсь, это поможет!

6 голосов
/ 01 мая 2009

Вызов внешних процессов из базы данных зависит от поставщика.

С головы до головы:

  • SQLServer может вызывать программы CLR из триггеры

  • postgresql может вызывать произвольный C функции загружаются динамически,

  • MySQL может вызывать произвольные функции C, но они должны быть скомпилированы в,

  • Sybase может делать системные вызовы, если установлено до этого.

1 голос
/ 01 мая 2009

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

Первый я назову "триггерами". Я уверен, что есть по крайней мере один поставщик БД, который думает, что триггеры отличаются от этого, но терпите меня. Триггер - это фрагмент кода на стороне сервера, который можно прикрепить к таблице. Например, вы можете запускать хранимую процедуру PSQL при каждом обновлении в таблице X. Некоторые базы данных позволяют записывать их на реальных языках программирования, другие - только в своем варианте SQL. Триггеры обычно достаточно быстрые и масштабируемые.

Другой я назову "события". Это триггеры, которые запускаются в базе данных и позволяют вам определять обработчик событий в вашей клиентской программе. IE, каждый раз, когда есть обновления для клиентской базы, запускайте updateClientsList в вашей программе. Например, используя python и firebird, смотрите http://www.firebirdsql.org/devel/python/docs/3.3.0/beyond-python-db-api.html#database-event-notification

Я полагаю, что предыдущее предложение использовать монитор является эквивалентным способом реализации этого с использованием какой-либо другой базы данных. Может быть, оракул? Службы уведомлений MSSQL, упомянутые в другом ответе, являются еще одной реализацией этого.

Я бы сказал, что вам лучше ДЕЙСТВИТЕЛЬНО знать, почему вы хотите, чтобы база данных уведомляла вашу клиентскую программу, в противном случае вам следует придерживаться триггеров на стороне сервера.

1 голос
/ 01 мая 2009

Самое простое, что нужно сделать, - это чтобы триггеры вставки / обновления / удаления сделали запись в некоторой таблице журнала, и чтобы ваша Java-программа наблюдала за этой таблицей. Хорошие столбцы в вашей таблице журналов - это такие вещи, как EVENT_CODE, LOG_DATETIME и LOG_MSG.

Если вам не требуется очень высокая производительность или вам не нужно обрабатывать 100 тыс. Записей, этого вполне достаточно.

0 голосов
/ 07 декабря 2012

Если вы используете postgresql, он может прослушивать уведомления от клиента JDBC.

0 голосов
/ 09 мая 2009

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

Дополнительная сложность добавления функциональности обратного вызова / триггера, на мой взгляд, не стоит того, если только она не поддерживается серверной частью базы данных и используемой клиентской библиотекой, как, например, службы уведомлений, предлагаемые для SQL Server 2005, используемые вместе с ADO. NET.

0 голосов
/ 01 мая 2009

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

0 голосов
/ 01 мая 2009

Если вы используете Oracle, посмотрите это предыдущий пост .

...