SqlDependency v aplikaci ASP.NET
Příklad v této části ukazuje, jak nepřímo použít SqlDependency využití ASP.NET SqlCacheDependency objektu. Objekt SqlCacheDependency používá SqlDependency k naslouchání oznámením a správné aktualizaci mezipaměti.
Poznámka:
Ukázkový kód předpokládá, že jste povolili oznámení dotazů spuštěním skriptů v povolení oznámení dotazů.
O ukázkové aplikaci
Ukázková aplikace používá jednu webovou stránku ASP.NET k zobrazení informací o produktu z databáze AdventureWorks SQL Serveru v ovládacím GridView prvku. Když se stránka načte, kód zapíše aktuální čas do Label ovládacího prvku. Pak definuje SqlCacheDependency objekt a nastaví vlastnosti Cache objektu pro uložení dat mezipaměti po dobu až tří minut. Kód se pak připojí k databázi a načte data. Když se stránka načte a aplikace běží ASP.NET načte data z mezipaměti, což můžete ověřit tak, že zjistíte, že se čas na stránce nezmění. Pokud se monitorovaná data změní, ASP.NET zneplatní mezipaměť a znovu naplní GridView
ovládací prvek čerstvými daty, aktualizuje čas zobrazený v ovládacím Label
prvku.
Vytvoření ukázkové aplikace
Pokud chcete vytvořit a spustit ukázkovou aplikaci, postupujte takto:
Vytvořte nový web ASP.NET.
Label Na stránku Default.aspx přidejte ovládací prvek a GridView ovládací prvek.
Otevřete modul třídy stránky a přidejte následující direktivy:
Option Strict On Option Explicit On Imports System.Data.SqlClient
using System.Data.SqlClient; using System.Web.Caching;
Do události stránky
Page_Load
přidejte následující kód: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
Přidejte dvě pomocné metody
GetConnectionString
aGetSQL
. Definovaný připojovací řetězec používá integrované zabezpečení. Budete muset ověřit, že účet, který používáte, má potřebná oprávnění k databázi a že ukázková databáze AdventureWorks má povolená oznámení.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
Testování aplikace
Aplikace ukládá data zobrazená ve webovém formuláři do mezipaměti a aktualizuje je každých tři minuty, pokud neexistuje žádná aktivita. Pokud dojde ke změně databáze, mezipaměť se okamžitě aktualizuje. Spusťte aplikaci ze sady Visual Studio, která načte stránku do prohlížeče. Zobrazený čas aktualizace mezipaměti označuje, kdy byla mezipaměť naposledy aktualizována. Počkejte tři minuty a pak aktualizujte stránku, což způsobí, že dojde k události postback. Všimněte si, že čas zobrazený na stránce se změnil. Pokud stránku aktualizujete za méně než tři minuty, zůstane čas zobrazený na stránce stejný.
Teď aktualizujte data v databázi pomocí příkazu Transact-SQL UPDATE a aktualizujte stránku. Zobrazený čas teď značí, že mezipaměť byla aktualizována novými daty z databáze. Všimněte si, že i když se mezipaměť aktualizuje, čas zobrazený na stránce se nezmění, dokud nedojde k události zpětného odeslání.
Synchronizace distribuované mezipaměti pomocí závislosti SQL
Některé z distribuovaných mezipamětí třetích stran, jako je NCache , poskytují podporu synchronizace databáze SQL a mezipaměti pomocí závislosti SQL. Další informace a ukázkovou implementaci zdrojového kódu najdete v ukázce závislostí SQL distribuované mezipaměti.