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:
- czy SqlDependency jest ogólnie uważane za wiarygodne?
- czy muszę się martwić o warunki wyścigu, np. zajmuję się jedną zmianą, gdy nadejdzie kolejna?
- 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?
- 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?
- (Edytuj) a co jeśli aplikacja padnie? Chyba będę musiał zapytać o utracone dane podczas uruchamiania?
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).
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.
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