Чи є опитування єдиним способом оновлення даних програми з бази даних?


17

Додаток повинен мати дані якомога свіжіше оновлені з бази даних. У такому випадку, чи є інший спосіб отримання даних, окрім таймера, який запитує (опитує) базу даних?

Я працюю з MS SQL Server 2008 (і .NET додатками + Entity Framework), але хотів би ознайомитися і з іншими типами баз даних.


Microsoft StreamInsight спеціально розроблений для того, щоб увімкнути обробку на основі "подій даних". Я мало що про це знаю, але це виглядає як повна і незалежна платформа, а не окрема особливість SQL Server. Ось схема архітектури StreamInsight .
Нік Чамма

Відповіді:


5

Сервіс-брокер для SQL Server 2005+ може зробити це.

Вибачте, я не впевнений у інших RDBMS


2
Чи можете ви детальніше розповісти, як це робить Брокер? @rem запитує про отримання оновлених подіями (на відміну від запущених часом) оновлень з бази даних. SB призначений для черги та обробки асик.
Нік Чаммас

1
-1 Схоже, у сервісного брокера нічого не вбудовано, щоб програма могла знати, що він отримав повідомлення. (На даний момент я
зациклювався

10

В Oracle ви можете використовувати вбудований пакет DBMS_ALERT для полегшення цього.

DBMS_ALERT підтримує асинхронне повідомлення про події бази даних (сповіщення). Завдяки правильному використанню цього тригера пакета та бази даних, програма може сповіщати про себе, коли змінюються значення, що цікавлять базу даних.

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


А для "MS SQL Server 2008" відповідно до питання про ОП? Вони попросили інших RDBMS, але це насправді не допомагає.
gbn

9
@gbn Чому це не допомагає? Я не можу відповісти на частину SQL Server, як ви можете, тому я відповів на частину, яку я міг. Ніхто не є експертом у всіх інших базах даних, але якщо ми кожен внесемо свої знання, ОП та майбутні відвідувачі знайдуть корисну інформацію. Я б очікував, що ОП прийме відповідь SQL Server та повторно проголосує інші корисні відповіді, наприклад Скотчера (+1).
Лі Риффель

добре сказано. Прочитавши вашу відповідь DBMS_ALERT, я дізнався ще один спосіб зробити це - більше інструментів для панелі інструментів! +1
ScottCher

7

Деякі постачальники баз даних також надають інтегровані шини повідомлень, на які ваша програма може просто підписатися:

Альтернативою може бути перенаправлення даних в базу даних, в першу чергу через шину повідомлень типу Tibco / RV і просто "розгалуження", в потоці, що йде в БД і один, що йде до вашої програми, або використовувати кешований шар на зразок узгодженості між вашим додатком та БД.


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: Ми розробили додатки, що використовують дотнет-фреймворк від Microsoft, які користуються функцією сповіщення про зміну баз даних Oracle спільно з ODP.Net (постачальником даних Oracle для dotnet). Використовуючи це, база даних насправді повідомляє додаток dotnet про надходження нових даних, що дозволяє нам уникати постійних опитувань. Посилання, на яке я посилаюсь вище, є підручником Oracle для того, щоб робити саме це. Сподіваюсь, це допоможе вам.

Не знаю про будь-які інші RDBMS.


2

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

Як тільки відбувається критичне оновлення / вставка / видалення, зовнішня програма викликається через щойно додану функціональність sys_exec, вбудовану в певні тригери. У цей момент у нас є все необхідне, щоб передати повідомлення кожному підключеному клієнту без необхідності опитування чи кількох запитів, оскільки все відбувається в режимі реального часу.


1

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

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

(Для повного розкриття інформації я працюю в Oracle над одним із продуктів, що використовують GoldenGate.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.