Element SqlDependency w aplikacji ASP.NET

W przykładzie w tej sekcji pokazano, jak używać SqlDependency pośrednio przy użyciu obiektu ASP.NET SqlCacheDependency . Obiekt SqlCacheDependency używa obiektu SqlDependency do nasłuchiwania powiadomień i poprawnej aktualizacji pamięci podręcznej.

Uwaga

Przykładowy kod zakłada, że włączono powiadomienia dotyczące zapytań, wykonując skrypty w temacie Włączanie powiadomień o zapytaniach.

Informacje o przykładowej aplikacji

Przykładowa aplikacja używa jednej strony internetowej ASP.NET do wyświetlania informacji o produkcie z bazy danych AdventureWorks SQL Server w kontrolce GridView . Gdy strona zostanie załadowana, kod zapisuje bieżący czas do kontrolki Label . Następnie definiuje SqlCacheDependency obiekt i ustawia właściwości obiektu w Cache celu przechowywania danych pamięci podręcznej przez maksymalnie trzy minuty. Następnie kod łączy się z bazą danych i pobiera dane. Po załadowaniu strony i uruchomieniu aplikacji ASP.NET pobierze dane z pamięci podręcznej, co można sprawdzić, zauważając, że czas na stronie nie ulega zmianie. Jeśli monitorowane dane zmieniają się, ASP.NET unieważnia pamięć podręczną i ponownie wypełnia GridView kontrolkę świeżymi danymi, aktualizując czas wyświetlany w kontrolce Label .

Tworzenie przykładowej aplikacji

Wykonaj następujące kroki, aby utworzyć i uruchomić przykładową aplikację:

  1. Utwórz nową witrynę ASP.NET sieci Web.

  2. Dodaj kontrolkę LabelGridView i do strony Default.aspx.

  3. Otwórz moduł klasy strony i dodaj następujące dyrektywy:

    Option Strict On  
    Option Explicit On  
    
    Imports System.Data.SqlClient  
    
    using System.Data.SqlClient;  
    using System.Web.Caching;  
    
  4. Dodaj następujący kod w zdarzeniu strony Page_Load :

    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. Dodaj dwie metody GetConnectionString pomocnicze i GetSQL. Zdefiniowana parametry połączenia używa zintegrowanych zabezpieczeń. Musisz sprawdzić, czy używane konto ma niezbędne uprawnienia bazy danych i czy przykładowa baza danych AdventureWorks ma włączone powiadomienia.

    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
    

Testowanie aplikacji

Aplikacja buforuje dane wyświetlane w formularzu sieci Web i odświeża je co trzy minuty, jeśli nie ma żadnej aktywności. Jeśli nastąpi zmiana bazy danych, pamięć podręczna zostanie natychmiast odświeżona. Uruchom aplikację z programu Visual Studio, która ładuje stronę do przeglądarki. Wyświetlany czas odświeżania pamięci podręcznej wskazuje, kiedy pamięć podręczna została ostatnio odświeżona. Poczekaj trzy minuty, a następnie odśwież stronę, powodując wystąpienie zdarzenia ogłaszania zwrotnego. Pamiętaj, że czas wyświetlany na stronie uległ zmianie. Jeśli odświeżysz stronę w mniej niż trzy minuty, czas wyświetlany na stronie pozostanie taki sam.

Teraz zaktualizuj dane w bazie danych przy użyciu polecenia Transact-SQL UPDATE i odśwież stronę. Wyświetlony czas wskazuje teraz, że pamięć podręczna została odświeżona przy użyciu nowych danych z bazy danych. Należy pamiętać, że chociaż pamięć podręczna jest aktualizowana, czas wyświetlany na stronie nie zmienia się do momentu wystąpienia zdarzenia powrotnego.

Synchronizacja rozproszonej pamięci podręcznej przy użyciu zależności SQL

Niektóre rozproszone pamięci podręczne innych firm, takie jak NCache , zapewniają obsługę synchronizowania bazy danych SQL i pamięci podręcznej przy użyciu zależności SQL. Aby uzyskać więcej informacji i przykładową implementację kodu źródłowego, zobacz Przykład zależności SQL rozproszonej pamięci podręcznej.

Zobacz też