SqlDependency in un'applicazione ASP.NET

L'esempio riportato in questa sezione illustra come usare SqlDependency indirettamente sfruttando l'oggetto ASP.NET SqlCacheDependency. L'oggetto SqlCacheDependency usa un SqlDependency per ascoltare le notifiche e aggiornare correttamente la cache.

Nota

Il codice di esempio presuppone che siano state abilitate le notifiche delle query eseguendo gli script in Abilitazione delle notifiche delle query.

Informazioni sull'applicazione di esempio

Nell'applicazione di esempio viene usata una singola pagina Web ASP.NET per visualizzare in un controllo GridView le informazioni sui prodotti disponibili nel database AdventureWorks di SQL Server. Quando la pagina viene caricata il codice scrive l'ora corrente in un controllo Label. Definisce quindi un oggetto SqlCacheDependency e imposta le proprietà nell'oggetto Cache per archiviare i dati della cache per un massimo di tre minuti. Il codice si connette quindi al database e recupera i dati. Quando la pagina viene caricata e l'applicazione è in esecuzione ASP.NET recupera i dati dalla cache ed è possibile verificarlo osservando che l'ora sulla pagina non cambia. Se i dati monitorati cambiano, ASP.NET invalida la cache e ripopola il controllo GridView con i dati aggiornati, adeguando l'ora visualizzata nel controllo Label.

Creazione dell'applicazione di esempio

Per creare ed eseguire l'applicazione di esempio, seguire questa procedura:

  1. Creare un nuovo sito Web ASP.NET.

  2. Aggiungere un Label e un controllo GridView alla pagina Default.aspx.

  3. Aprire il modulo di classe della pagina e aggiungere le direttive seguenti:

    Option Strict On  
    Option Explicit On  
    
    Imports System.Data.SqlClient  
    
    using System.Data.SqlClient;  
    using System.Web.Caching;  
    
  4. Aggiungere il codice seguente all'evento Page_Load della pagina:

    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = "Cache Refresh: " +
        DateTime.Now.ToLongTimeString();
    
        // Create a dependency connection to the database.
        SqlDependency.Start(GetConnectionString());
    
        using (SqlConnection connection =
            new SqlConnection(GetConnectionString()))
        {
            using (SqlCommand command =
                new SqlCommand(GetSQL(), connection))
            {
                SqlCacheDependency dependency =
                    new SqlCacheDependency(command);
                // Refresh the cache after the number of minutes
                // listed below if a change does not occur.
                // This value could be stored in a configuration file.
                int numberOfMinutes = 3;
                DateTime expires =
                    DateTime.Now.AddMinutes(numberOfMinutes);
    
                Response.Cache.SetExpires(expires);
                Response.Cache.SetCacheability(HttpCacheability.Public);
                Response.Cache.SetValidUntilExpires(true);
    
                Response.AddCacheDependency(dependency);
    
                connection.Open();
    
                GridView1.DataSource = command.ExecuteReader();
                GridView1.DataBind();
            }
        }
    }
    
    Protected Sub Page_Load(ByVal sender As Object, _
       ByVal e As System.EventArgs) Handles Me.Load
    
        Label1.Text = "Cache Refresh: " & _
           Date.Now.ToLongTimeString()
    
        ' Create a dependency connection to the database
        SqlDependency.Start(GetConnectionString())
    
        Using connection As New SqlConnection(GetConnectionString())
            Using command As New SqlCommand(GetSQL(), connection)
                Dim dependency As New SqlCacheDependency(command)
    
                ' Refresh the cache after the number of minutes
                ' listed below if a change does not occur.
                ' This value could be stored in a configuration file.
                Dim numberOfMinutes As Integer = 3
                Dim expires As Date = _
                    DateTime.Now.AddMinutes(numberOfMinutes)
    
                Response.Cache.SetExpires(expires)
                Response.Cache.SetCacheability(HttpCacheability.Public)
                Response.Cache.SetValidUntilExpires(True)
    
                Response.AddCacheDependency(dependency)
    
                connection.Open()
    
                GridView1.DataSource = command.ExecuteReader()
                GridView1.DataBind()
            End Using
        End Using
    End Sub
    
  5. Aggiungere due metodi helper, GetConnectionString e GetSQL. La stringa di connessione definita usa la sicurezza integrata. Sarà necessario verificare che l'account in uso disponga delle autorizzazioni del database richieste e che siano abilitate le notifiche nel database di esempio AdventureWorks.

    private string GetConnectionString()
    {
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
        return "Data Source=(local);Integrated Security=true;" +
          "Initial Catalog=AdventureWorks;";
    }
    private string GetSQL()
    {
        return "SELECT Production.Product.ProductID, " +
        "Production.Product.Name, " +
        "Production.Location.Name AS Location, " +
        "Production.ProductInventory.Quantity " +
        "FROM Production.Product INNER JOIN " +
        "Production.ProductInventory " +
        "ON Production.Product.ProductID = " +
        "Production.ProductInventory.ProductID " +
        "INNER JOIN Production.Location " +
        "ON Production.ProductInventory.LocationID = " +
        "Production.Location.LocationID " +
        "WHERE ( Production.ProductInventory.Quantity <= 100 ) " +
        "ORDER BY Production.ProductInventory.Quantity, " +
        "Production.Product.Name;";
    }
    
    Private Function GetConnectionString() As String
        ' To avoid storing the connection string in your code,
        ' you can retrieve it from a configuration file.
    
        Return "Data Source=(local);Integrated Security=true;" & _
         "Initial Catalog=AdventureWorks;"
    End Function
    
    Private Function GetSQL() As String
        Return "SELECT Production.Product.ProductID, " & _
        "Production.Product.Name, " & _
        "Production.Location.Name AS Location, " & _
        "Production.ProductInventory.Quantity " & _
        "FROM Production.Product INNER JOIN " & _
        "Production.ProductInventory " & _
        "ON Production.Product.ProductID = " & _
        "Production.ProductInventory.ProductID " & _
        "INNER JOIN Production.Location " & _
        "ON Production.ProductInventory.LocationID = " & _
        "Production.Location.LocationID " & _
        "WHERE ( Production.ProductInventory.Quantity <= 100) " & _
        "ORDER BY Production.ProductInventory.Quantity, " & _
        "Production.Product.Name;"
    End Function
    

Test dell'applicazione

L'applicazione memorizza nella cache i dati visualizzati nel Web Form e li aggiorna ogni tre minuti se non è presente alcuna attività. Se viene apportata una modifica al database, la cache viene aggiornata immediatamente. Eseguire l'applicazione da Visual Studio, che carica la pagina nel browser. L'ora di aggiornamento della cache visualizzata indica il momento in cui la cache è stata aggiornata l'ultima volta. Attendere tre minuti e quindi aggiornare la pagina, causando l'esecuzione di un evento di postback. Si noti che l'ora visualizzata nella pagina è cambiata. Se si aggiorna la pagina in meno di tre minuti, l'ora visualizzata sulla pagina rimane invariata.

A questo punto aggiornare i dati nel database usando un comando Transact-SQL UPDATE e aggiornare la pagina. L'ora visualizzata indica che la cache è stata aggiornata con i nuovi dati provenienti dal database. Si noti che sebbene la cache venga aggiornata, l'ora visualizzata sulla pagina non cambia finché non si verifica un evento di postback.

Sincronizzazione della cache distribuita usando la Dipendenza SQL

Alcune delle cache distribuite di terze parti, ad esempio NCache, forniscono supporto per sincronizzare il database SQL e la cache usando la Dipendenza SQL. Per altre informazioni e un esempio di implementazione del codice sorgente, vedere esempio di Dipendenza SQL della cache distribuita.

Vedi anche