2009-02-25 9 views
10

Jaki jest najlepszy sposób zaprogramowania natychmiastowej reakcji na aktualizację danych w bazie danych?Jaki jest najlepszy sposób, aby aplikacja kliencka natychmiast reagowała na aktualizację w bazie danych?

Najprostszą metodą, jaką mogę wymyślić, jest wątek, który sprawdza bazę danych pod kątem określonej zmiany niektórych danych i stale czeka na jej sprawdzenie przez pewien wstępnie zdefiniowany okres czasu. To rozwiązanie wydaje się być nieekonomiczne i nieoptymalne dla mnie, więc zastanawiałem się, czy istnieje lepszy sposób.

Myślę, że musi istnieć jakiś sposób, mimo że aplikacja internetowa, taka jak Gmail, wydaje się być w stanie zaktualizować moją skrzynkę pocztową niemal natychmiast po wysłaniu do mnie nowej wiadomości e-mail. Z pewnością mój klient ciągle nie sprawdza poprawności. Myślę, że sposób w jaki to robią jest z AJAX, ale jak AJAX może zachowywać się jak zdalne wywołanie funkcji, którego nie znam. Chciałbym wiedzieć, jak to robi Gmail, ale najbardziej chciałbym wiedzieć, jak to zrobić w ogólnym przypadku z bazą danych.

Edytuj: Uwaga: chcę natychmiast reagować na aktualizację kodu klienta, a nie na samą bazę danych, o ile wiem, wyzwalacze nie mogą tego zrobić. Zasadniczo chcę, aby UŻYTKOWNIK otrzymał powiadomienie lub jego ekran został zaktualizowany po dokonaniu zmiany w bazie danych.

+0

Wow wiele osób reaguje na tytuł tematu, nie czytając pytania. To nie jest człowiek wyzwalający !! Gdybym miał dzisiaj jakieś głosy, zagłosowałbym na wszystkich, aby dać im lekcję do przeczytania tego cholernego pytania, zanim odpowiem. –

+0

Cóż, to trochę trudne. Pytanie tylko wymagało magii. Jeśli chce natychmiastowej reakcji, prawdopodobnie zostaną w to zaangażowane wyzwalacze. – Dana

+0

@Dana: Nie jest to trudne, by oczekiwać od ludzi przeczytania pytania przed próbą odpowiedzi. Nie, on nie prosi o magię, używa prawdziwego przykładu pracy (Gmail) jako modelu. I nie, wyzwalacze prawdopodobnie NIE będą zaangażowani. –

Odpowiedz

7

Zasadniczo są dwie kwestie tutaj:

  1. chcesz przeglądarkę, aby móc odbierać asynchronicznych zdarzeń z serwera aplikacji WWW bez odpytywania w ciasnej pętli.

  2. Chcesz, aby aplikacja internetowa mogła odbierać zdarzenia asynchroniczne z bazy danych bez wykonywania sondowania w ciasnej pętli.

Dla Zadanie nr 1

zobaczyć te linki Wikipedii rodzaju technik Chyba szukasz:

EDYCJA: 19 marca 2009 r. - natknąłem się na ReverseHTTP, co może być interesujące dla problemu nr 1.

Dla Zadanie nr 2

Rozwiązaniem ma być specyficzne dla której bazy danych używasz i prawdopodobnie sterownik bazy danych serwer używa zbyt. Na przykład z PostgreSQL użyjesz LISTEN i NOTIFY. (I na ryzyko, że zostanie przegłosowany, prawdopodobnie użyjesz wyzwalaczy bazy danych do wywołania polecenia NOTIFY po zmianie danych tabeli.)

Innym możliwym sposobem wykonania tej czynności jest utworzenie bazy danych o numerze an interface procedury lub wyzwalacze, które łączą się z biblioteką dynamiczną (np. plik DLL lub .so). Następnie możesz napisać kod sygnalizacji serwera w C or whatever.

W tym samym temacie niektóre bazy danych umożliwiają pisanie procedur przechowywanych w językach takich jak Java, Ruby, Python i others. Możliwe, że będziesz mógł użyć jednego z nich (zamiast czegoś, co kompiluje się do biblioteki maszynowej, takiej jak C), do mechanizmu sygnalizacji.

Nadzieję, że daje wystarczająco dużo pomysłów, aby zacząć.

+0

Tego właśnie szukałem. Dzięki! – Daniel

+0

Nie wiem dlaczego, ale push serwera rzadko jest dobrze wykorzystywany. – Faiz

1

Cóż, najlepszym sposobem jest bazy danych trigger. Zależy od możliwości Twojego DBMS, które nie zostały określone, aby je wspierać.

Ponowna edycja: sposób, w jaki aplikacje takie jak Gmail robią, to w rzeczywistości z sondowaniem AJAX. Zainstaluj rozszerzenie Firefox Tamper Data, aby zobaczyć je w akcji. Sztuczka polega na tym, że zapytanie o polling działa bardzo szybko w przypadku "braku wiadomości".

+0

Proszę zobaczyć moją edycję powyżej, o ile wiem, wyzwalacze nie mogą zrobić tego, o co proszę. – Daniel

+0

Ponownie edytuj: wydaje mi się to szalone, ponieważ w Gmailu jest mnóstwo klientów, którzy cały czas sondują serwer, wydaje się tak nieefektywny. Musi być lepszy sposób ... Ale dzięki za ten wgląd, nie pomyślałbym, że tak właśnie się stało. – Daniel

+0

Alternatywny "serwer push", Big New Thing, który rewolucjonizuje Web z 1994 roku, polega na utrzymywaniu aktywnego połączenia TCP dla każdego klienta, co jest wykładniczo gorszym pomysłem. – chaos

6

I rysunek musi być jakiś sposób, po wszystkim aplikacji internetowych takich jak Gmail wydaje zaktualizować skrzynkę niemal natychmiast po nowy adres e-mail został wysłany do mnie. Na pewno mój klient nie jest stale sprawdzanie aktualizacji przez cały czas. I myślę, że sposób to zrobić z AJAX, ale jak AJAX może zachowywać się jak zdalne wywołanie funkcji, nie wiem. Chciałbym wiedzieć, jak to jest w Gmailu , ale to, co chciałbym wiedzieć, to , jak to zrobić w ogólnym przypadku z bazą danych.

Zobacz, co słychać u Wiresharka ... Jest trochę ruchu google, który się tam regularnie pojawia.

W zależności od bazy danych wyzwalacze mogą pomóc. Aplikacja, którą napisałem, opiera się na wyzwalaczach, ale używam mechanizmu odpytywania, aby "wiedzieć", że coś się zmieniło. O ile nie można zakomunikować zmiany w bazie danych, konieczny jest mechanizm ankietowania.

Tylko moje dwa centy.

1

Niestety, nie ma sposobu, aby przesłać dane do przeglądarki internetowej - możesz wysyłać dane tylko w odpowiedzi na żądanie - tak działa HTTP.

AJAX jest tym, czego chcesz używać: wywoływanie usługi internetowej raz na sekundę nie jest nadmierne, pod warunkiem, że zaprojektujesz usługę internetową, aby upewnić się, że otrzymujesz niewielką ilość danych, odsyła niewielką kwotę i może działać bardzo szybko, aby wygenerować tę odpowiedź.

+0

Co do zwykłych aplikacji komputerowych z zapleczem bazy danych. Czy istnieje sposób przesyłania danych do aplikacji z bazy danych? Może jakiś rodzaj połączenia, który pozostaje otwarty? – Daniel

+0

To nieprawda. Push serwera działa. To po prostu kolosalnie zły pomysł. – chaos

+0

Chaos dzięki - nie wiedziałem o tym. Chyba dlatego, że to taki zły pomysł, nigdy o nim nie słyszałem! :-) – teedyay

Powiązane problemy