Получение событий от базы данных

Хорошо ... Я понял, что работает. Я сейчас вызываю свою функцию в другом месте, и она работает. Все еще не имеет смысла, почему я могу позвонить другому в том же месте, и это работает, но это не ... но эй ... теперь это работает! спасибо всем!

31
задан bluish 2 March 2012 в 10:46
поделиться

11 ответов

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

15
ответ дан 27 November 2019 в 22:34
поделиться

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

0
ответ дан 27 November 2019 в 22:34
поделиться

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

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

0
ответ дан 27 November 2019 в 22:34
поделиться

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

0
ответ дан 27 November 2019 в 22:34
поделиться

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

1
ответ дан 27 November 2019 в 22:34
поделиться

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

Просто не в моей голове:

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

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

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

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

6
ответ дан 27 November 2019 в 22:34
поделиться

Здесь есть несколько различных техник в зависимости от базы данных, которую вы используете. Одна идея - опросить базу данных (которую, я уверен, вы пытаетесь избежать). По сути, вы можете проверять наличие изменений очень часто.

Другое решение (если вы используете SQL Server 2005) - это использование служб Notification Services, хотя эта технология предположительно заменяется в SQL 2008 (мы не видели чистой замены). пока, но Microsoft публично об этом говорила).

0
ответ дан 27 November 2019 в 22:34
поделиться

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

Первое, что я назову «триггеры». Я уверен, что есть по крайней мере один поставщик БД, который думает, что триггеры отличаются от этого, но терпите меня. Триггер - это фрагмент кода на стороне сервера, который можно прикрепить к таблице. Например, вы можете запускать хранимую процедуру 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
ответ дан 27 November 2019 в 22:34
поделиться

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

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

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

7
ответ дан 27 November 2019 в 22:34
поделиться

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

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

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

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

Джеймс

13
ответ дан 27 November 2019 в 22:34
поделиться

I would suggest using a timestamp column, last updated, together with possibly the user updating the record, and then let the clients check their local record timestamp against that of the persisted record.

The added complexity of adding a callback/trigger functionality is just not worth it in my opinion, unless supported by the database backend and the client library used, like for instance the notification services offered for SQL Server 2005 used together with ADO.NET.

-1
ответ дан 27 November 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: