In che modo un SQLCacheDependency sa quando comunicare di nuovo ad ascoltatori quando i dati in una tabella cambiano?

StackOverflow https://stackoverflow.com/questions/7353558

Domanda

Ho fatto alcune ricerche e posso vedere la maggior parte dell'impianto idraulico per questo sistema, tuttavia non sono sicuro di come SQL Server sappia quando sparare un messaggio a qualsiasi ascoltatore (applicazioni) quando i dati in una tabella cambiano, ad esempio. Inizierò spiegando ciò che ho capito fino al punto in cui mi sto perdendo.

1) Il broker di servizi deve essere abilitato nel database e alcune autorizzazioni devono essere impostate.

2) Lo schema del database deve essere distribuito.

3) Utilizzando ASPNET_REGSQL.EXE, abilita la dipendenza dalla cache SQL per il database e le tabelle per la cache di dati per la memorizzazione nella cache dei dati (questo passaggio crea una tabella per tracciare modifiche e scatenanti sulle tabelle per acquisire le modifiche e incrementare un valore in quella tabella).

4) Imposta la dipendenza dalla cache SQL nell'applicazione .NET. Ad esempio, in un'app Web, dovrai aggiungere valori di configurazione per il tempo del sondaggio, la stringa di connessione, ecc.; Avvia/arresta la dipendenza nel tuo global.asax.cs, quindi aggiungi le dipendenze della cache SQL quando aggiungi elementi alla cache.

4a) Parte di ciò che accade quando si avvia la dipendenza è che l'infrastruttura è impostata per una coda, un servizio e uno SPROC per la comunicazione e la pulizia in seguito. Utilizzando SQL Query Profiler, è possibile visualizzare la connessione e un canale di comunicazione impostato sul servizio per l'applicazione per ricevere messaggi da SQL Server.

5) Qui è dove mi confongo. A questo punto, ho memorizzato nella cache un elemento nella cache dell'applicazione con un riferimento alla dipendenza dalla cache SQL dalla tabella sottostante in modo che la mia app possa ricevere modifiche nel caso in cui le modifiche della riga. Se eseguo manualmente un aggiornamento su quella riga, posso vedere il grilletto che viene colpito e il valore nella tabella di tracciamento viene incrementato di 1. Tuttavia, non vedo alcuna comunicazione tornare all'applicazione, nulla su Profiler di query SQL, né L'elemento è rimosso dalla cache. Inoltre non vedo nulla nelle code sul database (né la coda di applicazione dinamica né le code di errore/trasmissione standard)

La mia domanda è: cosa sta guardando quella tabella di tracciamento nel database in modo che i messaggi possano essere inviati alle dipendenze SQL che sono preoccupate per le modifiche a questi dati?

Qualsiasi aiuto è molto apprezzato ... Ho cercato molti riferimenti online e non riesco a trovare alcuna spiegazione concreta di questo.

È stato utile?

Soluzione

Nel tuo database viene creata una nuova tabella che contiene un nome della tabella su cui si desidera verificare gli aggiornamenti e un numero di modifica. Ogni tabella che si dispone di SQLDEpendency ha un trigger impostato per aggiornamenti/inserti che aumentano il cambiamento nella nuova tabella che ho appena descritto.

Il tuo modello mentale di come funziona è all'indietro. L'applicazione controlla il registro per determinare se una tabella è cambiata.

Quindi, se la tabella di Changelog (è quello che lo chiamo) è traccia di due tabelle nel tuo database (prodotto, utente), sembrerà così.

+Table Name + ChangeNumber +
| Product   | 1            |
+-----------+--------------+
| User      | 1            |
+-----------+--------------+

Ora se modifichi qualcosa in una di queste tabelle, il trigger increverà ChangeNumber E ora sappiamo che sono cambiati.

Ovviamente c'è di più in questo, ma questa è l'idea generale.

Nota: va notato che è possibile invalidare una pagina se una o più tabelle cambiano, quindi se la tua pagina ha una dipendenza impostata per entrambe queste tabelle, se una di esse cambia, invaliderà la pagina memorizzata nella cache e riesce a ricevere un aggiornamento versione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top