Czy odpytywanie jest jedynym sposobem na aktualizację danych aplikacji z bazy danych?

17

Aplikacja musi mieć zaktualizowane dane z bazy danych, jak to możliwe. W takim przypadku, czy jest jakiś inny sposób na uzyskanie danych, poza żądaniem (odpytywaniem) bazy danych na podstawie timera?

Pracuję z MS SQL Server 2008 (i aplikacjami .NET + Entity Framework), ale chciałbym również poznać inne typy baz danych.

rem
źródło
Microsoft StreamInsight został specjalnie zaprojektowany, aby umożliwić przetwarzanie oparte na „zdarzeniu danych”. Niewiele o tym wiem, ale wygląda raczej na kompletną i niezależną platformę niż na indywidualną funkcję SQL Server. Oto schemat architektury StreamInsight .
Nick Chammas

Odpowiedzi:

5

Service Broker dla SQL Server 2005+ może to zrobić.

Przepraszam, nie jestem pewien innych RDBMS

gbn
źródło
2
Czy możesz wyjaśnić, w jaki sposób robi to Service Broker? @rem pyta o pobieranie aktualizacji wyzwalanych zdarzeniami (w przeciwieństwie do wyzwalanych czasowo) z bazy danych. SB służy do kolejkowania i przetwarzania asyc.
Nick Chammas,
1
-1 Service Broker wydaje się, że nie ma nic wbudowanego w aplikację, aby poinformować aplikację, że otrzymała wiadomość. (Obecnie utknąłem w tej kwestii.)
Vaccano
10

W Oracle możesz użyć wbudowanego pakietu DBMS_ALERT, aby to ułatwić.

DBMS_ALERT obsługuje asynchroniczne powiadamianie o zdarzeniach w bazie danych (alerty). Dzięki odpowiedniemu wykorzystaniu tego pakietu i wyzwalaczy bazy danych aplikacja może powiadomić się za każdym razem, gdy zmieniane są wartości danych w bazie danych.

Załóżmy, że narzędzie graficzne wyświetla wykres niektórych danych z tabeli bazy danych. Narzędzie graficzne może po odczytaniu i zobrazowaniu danych czekać na alert bazy danych (WAITONE) obejmujący właśnie odczytane dane. Narzędzie automatycznie budzi się, gdy dane zostaną zmienione przez innego użytkownika. Wszystko, co jest wymagane, to umieszczenie wyzwalacza w tabeli bazy danych, która wykonuje sygnał (SYGNAŁ) przy każdym uruchomieniu wyzwalacza.

Leigh Riffel
źródło
A dla „MS SQL Server 2008” jak na pytanie PO? Poprosili o inne RDBMS, ale tak naprawdę to nie pomaga.
gbn
9
@gbn Dlaczego to nie pomaga? Nie mogę odpowiedzieć na część programu SQL Server tak jak ty, więc odpowiedziałem na część, na którą mogłem. Nikt nie jest ekspertem we wszystkich innych bazach danych, ale jeśli każdy z nas wniesie swoją wiedzę, PO i przyszli goście znajdą przydatne informacje. Oczekiwałbym, że OP przyjmie odpowiedź na SQL Server i zagłosuje za innymi przydatnymi odpowiedziami, takimi jak ScottCher (+1).
Leigh Riffel,
dobrze powiedziane. Po przeczytaniu twojej odpowiedzi DBMS_ALERT nauczyłem się innego sposobu na zrobienie tego - więcej narzędzi do zestawu narzędzi! +1
ScottCher,
7

Niektórzy dostawcy baz danych zapewniają również zintegrowane szyny komunikatów, które Twoja aplikacja może po prostu subskrybować:

Alternatywą byłoby kierowanie danych do bazy danych w pierwszej kolejności za pośrednictwem magistrali komunikatów, takiej jak Tibco / RV, i po prostu „rozgałęzienie” ich w strumieniu przechodzącym do bazy danych i jednego do aplikacji lub użycie warstwy buforującej, takiej jak Coherence między twoją aplikacją a bazą danych.

Gajusz
źródło
7

LISTEN / NOTIFY dla PostgreSQL

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

w bazie danych ...

NOTIFY static_channel_name, 'static-message';

lub w funkcji / wyzwalacz:

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

w kliencie bazy danych:

LISTEN some_channel_name; --note the lack of quotes

Klient LISTEN otrzyma identyfikator procesu PostgreSQL, nazwę kanału i wartość komunikatu.

Standardowy sterownik JDBC dla PostgreSQL nie lubi powiadomień, można jednak użyć do tego celu https://github.com/impossibl/pgjdbc-ng sterownika

Neil McGuigan
źródło
5

Inne rozwiązanie Oracle: Opracowaliśmy aplikacje wykorzystujące platformę dotnet firmy Microsoft, które korzystają z funkcji powiadomienia o zmianie bazy danych Oracle w połączeniu z ODP.Net (dostawcą danych Oracle dla dotnet). Korzystając z tego, baza danych faktycznie powiadamia aplikację dotnet o pojawieniu się nowych danych, co pozwala nam uniknąć ciągłego odpytywania. Odnośnik, do którego odwołuję się powyżej, to samouczek Oracle dotyczący tego. Mam nadzieję, że to ci pomoże.

Nie wiem o żadnych innych RDBMS.

ScottCher
źródło
2

W przypadku jednej z naszych aplikacji (dostępnej przez Chrome i TYLKO Chrome) używamy MySQL z sys_exec UDF . Zasadniczo dlaczego Chrome - ze względu na obsługę WebSocket.

Po wystąpieniu krytycznej aktualizacji / wstawiania / usuwania program zewnętrzny jest wywoływany przez nowo dodaną funkcjonalność sys_exec osadzoną w niektórych wyzwalaczach. W tym momencie mamy wszystko, czego potrzebujemy, aby przekazać wiadomość każdemu podłączonemu klientowi bez potrzeby odpytywania lub wielu zapytań, ponieważ wszystko dzieje się w czasie rzeczywistym.

Furikan
źródło
1

Używamy kombinacji Oracle GoldenGate i Java Persistence API (JPA), aby zrobić to z bazą danych Oracle, ale także z DB2, Sybase, Microsoft SQL Server, MySQL, Teradata itp. Funkcja ta jest opisana tutaj: http: // docs .oracle.com / middleware / 1212 / coherence / COHIG / golden_g.htm

GoldenGate przekształca dziennik transakcji bazy danych w filtrowany strumień zdarzeń, który można wykorzystać w dowolnym miejscu w sieci. Używamy go do przekształcania odpowiednich transakcji w aktualizacje pamięci podręcznej lub unieważnienia pamięci podręcznej, które mogą wyzwalać zdarzenia na poziomie aplikacji, np. Wypychając dane do aplikacji komputerowych lub aplikacji websocket HTML5.

(W celu pełnego ujawnienia informacji pracuję w Oracle nad jednym z produktów wykorzystujących GoldenGate.)

cpurdy
źródło