1) Tak, uważam, że jest to wiarygodne, ponieważ działa poprawnie, do czego został zaprojektowany (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 pobraniem danych a powiadomieniem o nowych aktualizacjach
3) Ponowne uruchomienie bazy danych (lub instancji) sygnalizuje wszystkie oczekujące powiadomienia o zapytaniach za pomocą SqlNotificationInfo
wartość Restart
. Przeczytaj, jak SqlDependency i opiera się na powiadomieniu o zapytaniu
dla lepszego zrozumienia. Jako 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 niżej...
5) Nie ma „brakujących danych”. Powiadomienie o zapytaniu (a tym samym SqlDependency) nigdy nie powiadamia Cię o co dane uległy zmianie. Powiadamia tylko, że to się zmieniło . Zawsze powinieneś wrócić i przeczytać wszystko dane z powrotem, aby zobaczyć, co się zmieniło (i odsyłam do pytania/odpowiedzi nr 2). Nowo uruchomiona aplikacja nie odpytywała jeszcze o dane, więc nie ma żadnych zmian, o których trzeba by było powiadomić. Tylko po najpierw zapytał o dane, czy może otrzymać powiadomienie.
Z opisu Twojego problemu nie wynika, że potrzebujesz powiadomień o zapytaniach. Wydaje mi się, że chcesz działać na każdą zmianę, bez względu na to, kiedy to się stało, nawet jeśli Twoja aplikacja nie była uruchomiona . Z pewnością nie jest to unieważnianie pamięci podręcznej, ale śledzenie zmian. Dlatego musisz wdrożyć technologię śledzenia zmian, taką jak Zmień przechwytywanie danych lub Śledzenie zmian , z których oba są tylko SQL Server 2008 i nowsze (niedostępne w SQL Server 2005). W przypadku SQL Server 2005 nie jest niczym niezwykłym wdrożenie wyzwalacza i kolejkowanie komunikatu dla Broker usług aby poradzić sobie z tym samym problemem, który próbujesz rozwiązać (wykrywaj zmiany, reaguj na każdy wiersz nowych danych).