Является ли опрос единственным способом обновления данных приложения из базы данных?

17

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

Я работаю с MS SQL Server 2008 (и приложениями .NET + Entity Framework), но мне бы хотелось узнать и о других типах баз данных.

рем
источник
Microsoft StreamInsight специально разработан для обеспечения обработки на основе событий данных. Я не знаю много об этом, но это похоже на полную и независимую платформу, а не отдельную особенность SQL Server. Вот диаграмма архитектуры StreamInsight .
Ник Чаммас

Ответы:

5

Service Broker для SQL Server 2005+ может сделать это.

Извините, я не уверен в других RDBMS

ГБН
источник
2
Не могли бы вы рассказать, как это делает Service Broker? @rem запрашивает извлечение обновленных событий (в отличие от времени) из базы данных. SB для очередей и асинхронной обработки.
Ник Чаммас
1
-1 Компонент Service Broker, похоже, не имеет встроенной функции, позволяющей приложению узнать, что оно получило сообщение. (Я в настоящее время застрял в этом вопросе.)
Vaccano
10

В Oracle вы можете использовать встроенный пакет DBMS_ALERT, чтобы облегчить это.

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

Предположим, графический инструмент отображает график некоторых данных из таблицы базы данных. Графический инструмент может после чтения и построения графиков данных ожидать оповещение базы данных (WAITONE), охватывающее только что прочитанные данные. Инструмент автоматически просыпается, когда данные изменяются любым другим пользователем. Все, что требуется, - это поместить триггер в таблицу базы данных, которая выполняет сигнал (SIGNAL) при каждом срабатывании триггера.

Ли Риффель
источник
А для "MS SQL Server 2008" по вопросу ОП? Они попросили другие RDBMS, но это на самом деле не помогает.
Гбн
9
@gbn Почему это не помогает? Я не могу ответить на часть SQL Server, как вы можете, поэтому я ответил на часть, которую я мог. Никто не является экспертом во всех других базах данных, но если каждый из нас поделится своими знаниями, OP и будущие посетители найдут полезную информацию. Я ожидаю, что OP примет ответ SQL Server и проголосует за другие полезные ответы, такие как Скотчер (+1).
Ли Риффель
хорошо сказано. Прочитав ваш ответ DBMS_ALERT, я узнал другой способ сделать это - больше инструментов для набора инструментов! +1
ScottCher
7

Некоторые поставщики баз данных также предоставляют интегрированные шины сообщений, на которые ваше приложение может просто подписаться:

В качестве альтернативы можно было бы сначала направить данные в базу данных через шину сообщений, например Tibco / RV, и просто «разветвлять» ее, когда поток идет в БД, а другой - в ваше приложение, или использовать уровень кэширования, такой как Coherence. между вашим приложением и БД.

Gaius
источник
7

СЛУШАТЬ / УВЕДОМИТЬ для PostgreSQL

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

в базе данных ...

NOTIFY static_channel_name, 'static-message';

или в функции / триггере:

perform pg_notify('dynamic-channel-name', 'dynamic-message');

в клиенте базы данных:

LISTEN some_channel_name; --note the lack of quotes

Клиент LISTEN получит идентификатор процесса PostgreSQL, имя канала и значение сообщения.

Стандартный драйвер JDBC для PostgreSQL не любит уведомления, однако для этой цели вы можете использовать драйвер https://github.com/impossibl/pgjdbc-ng

Нил Макгиган
источник
5

Другое решение Oracle: мы разработали приложения, использующие среду dotnet от Microsoft, которая использует функцию уведомления об изменении базы данных Oracle в сочетании с ODP.Net (поставщик данных Oracle для dotnet). Используя это, база данных фактически уведомляет приложение dotnet о поступлении новых данных, что позволяет нам избежать постоянного опроса. Ссылка, на которую я ссылаюсь выше, является руководством по Oracle для этого. Надеюсь, что это помогает вам.

Не знаю ни о каких других РСУБД.

ScottCher
источник
2

Для одного из наших приложений (доступ через Chrome и ТОЛЬКО Chrome) мы используем MySQL с sys_exec UDF . В основном, почему Chrome - благодаря поддержке WebSocket.

Как только происходит критическое обновление / вставка / удаление, внешняя программа вызывается через вновь добавленную функциональность sys_exec, встроенную в определенные триггеры. На этом этапе у нас есть все, что нам нужно, чтобы передать сообщение каждому подключенному клиенту без необходимости опроса или нескольких запросов, поскольку все происходит в режиме реального времени.

Furicane
источник
1

Мы используем комбинацию Oracle GoldenGate и Java Persistence API (JPA), чтобы сделать это с базой данных Oracle, а также с DB2, Sybase, Microsoft SQL Server, MySQL, Teradata и т. Д. Функция описана здесь: http: // docs .oracle.com / промежуточное программное обеспечение / 1212 / когерентность / COHIG / golden_g.htm

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

(Для полного раскрытия я работаю в Oracle над одним из продуктов, использующих GoldenGate.)

cpurdy
источник