Niezawodność SqlDependency?

Moja obecna sytuacja jest taka, że mam aplikację, którą należy powiadomić, gdy nowe dane pojawią się w tabeli bazy danych. Dane pochodzą z zewnętrznego źródła (nad którym nie mam kontroli-jest to jedyna opcja integracji). Gdy pojawią się nowe dane, moja aplikacja musi podjąć pewne działania-zasadniczo odpytywać o nowe dane, obsługiwać je, wstawiać wynik do tabeli lokalnej itp.

Chcę uniknąć sondażu, jeśli to możliwe, ponieważ oczekuje się, że dane będą przetwarzane w rzeczywistym czas. To powiedziawszy, upewnienie się, że żadne dane nigdy nie zostaną pominięte, jest priorytetem NR 1.

Moje pytania:

  1. czy SqlDependency jest ogólnie uważane za wiarygodne?
  2. czy muszę się martwić o warunki wyścigu, np. zajmuję się jedną zmianą, gdy nadejdzie kolejna?
  3. co się stanie, gdy baza danych zostanie ponownie uruchomiona? Czy moja aplikacja odzyska przytomność i zacznie ponownie otrzymywać zmiany, czy też będę potrzebował pewnego rodzaju zegara awaryjnego, który będzie ponownie otrzymywać powiadomienia okresowo?
  4. większość artykułów przeczytałem na temat adres SQL Server 2005. Używam SQL Server 2008 R2. Czy istnieje nowsza technika, która jest preferowana niż SqlDependency?
  5. (Edytuj) a co jeśli aplikacja padnie?  Chyba będę musiał zapytać o utracone dane podczas uruchamiania?
Author: Phil Sandler, 2012-09-17

2 answers

1) tak, uważam, że jest wiarygodny, ponieważ w nim działa poprawnie cel został zaprojektowany do zrobienia (unieważnienie pamięci podręcznej)

2) nie. Dlatego możesz subskrybować tylko poprzez wysłanie zapytania, co zapewnia, że nie ma wyścigu między pobieraniem danych a nowymi aktualizacjami powiadamiającymi

3) Baza Danych (lub instancja) restart sygnalizuje wszystkie oczekujące powiadomienia o zapytaniach za pomocą SqlNotificationInfo wartość Restart. Przeczytaj jak SqlDependency i opiera się na powiadomieniu o zapytaniu dla lepszego zrozumienie. Ponieważ SqlDependency utrzymuje otwarte połączenie z bazą danych przez cały czas, niedostępność bazy danych zostanie wykryta przez SqlDependency nawet przed jakimkolwiek wyraźnym powiadomieniem o zapytaniu

4) nie. Więcej na ten temat...

5) nie ma "pominiętych danych". Powiadomienie o zapytaniu (a co za tym idzie SqlDependency) nigdy nie informuje o zmianie danych . Informuje tylko, że zmieniła się. Zawsze powinieneś wrócić i przeczytać wszystkie dane z powrotem do Zobacz też co się zmieniło (i odsyłam do pytania / odpowiedzi nr 2). Nowo uruchomiona aplikacja nie zapytała jeszcze o dane, więc nie ma żadnych zmian, o których należy powiadamiać. Tylko po najpierw zapyta dane może otrzymać powiadomienie.

Z opisu Twojego problemu nie jestem przekonany, że potrzebujesz powiadomień o zapytaniach. Wydaje mi się, że chcesz działać na każdą zmianę, nie ważne kiedy to się stało, nawet jeśli aplikacja nie była uruchomiona. To to z pewnością nie unieważnienie pamięci podręcznej, to śledzenie zmian. Dlatego musisz wdrożyć technologię śledzenia zmian, taką jak Change Data Capture lub Change Tracking , z których oba są tylko SQL Server 2008 i nowsze (niedostępne w SQL Server 2005). Z SQL Server 2005 nie jest rzadkością, aby wdrożyć wyzwalacz i kolejkować wiadomość dla Service Broker , aby poradzić sobie z tym samym problemem, który próbujesz obsłużyć (wykryć zmiany, reagować na każdy wiersz nowych danych).

 53
Author: Remus Rusanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-17 06:58:25

Przyjście do niego z punktu widzenia programisty. NET, aby po prostu chcieć go użyć do unieważnienia pamięci podręcznej, było prawdziwym bólem i nie jest całkowicie wiarygodne.

Konfiguracja i rozwiązywanie problemów było szczególnie bolesne, w jednym środowisku działa dobrze, ale w innym nie działa. Zastanawianie się, dlaczego było trudne i czasochłonne.

Nawet gdy wszystko działa, nie jest całkowicie niezawodny. SQL Server może upuścić powiadomienia, jeśli jest pod dużym obciążeniem i znane są problemy z ponownym uruchomieniem i powiadomieniami, które nie są wznawiane: http://connect.microsoft.com/SQLServer/feedback/details/543921/sqldependency-incorrect-behaviour-after-sql-server-restarts.

Unikałbym, jeśli istnieje alternatywna technologia, która robi to, co chcesz i jest mniej kłopotliwa.

 4
Author: Mant101,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-20 14:56:11