— 返回啟用了 SQL Cache Invalidation 的所有表的列表。
例如,使用列表 2 中的 ASP.Net 頁面,您可以為 Pubs 數據庫中的任何表配置 SQL Cache Invalidation(參見圖 2)。
圖 2:從 ASP.Net 頁面中啟用 SQL Cache Invalidation
列表 2:EnableSCI.ASPx (C#)
<%@ Page Language="c#" %>
<%@ Import Namespace="System.Web.Caching" %>
<script runat="server">
const string connectionString = "Server=localhost;Database=Pubs";
void Page_Load()
{
if (!IsPostBack)
{
SqlCacheDependencyAdmin.EnableNotifications(
connectionString);
SqlDataSource1.SelectParameters.Add("connectionString",
connectionString);
}
}
void EnableTable(Object s, EventArgs e)
{
try
{
SqlCacheDependencyAdmin.EnableTableForNotifications(
connectionString, txtTableName.Text);
}
catch (Exception ex)
{
lblErrorMessage.Text = ex.Message;
}
txtTableName.Text = "";
}
</script>
<Html>
<head runat="server">
<title>Enable SQL Cache Invalidation</title>
</head>
<body>
<form id="form1" runat="server">
<h1>SQL Cache Invalidation</h1>
以下表格已啟用 SQL Cache Invalidation:
<p>
<ASP:GridVIEw id="grdTables"
DataSourceID="SqlDataSource1" CellPadding="10"
ShowHeader="false" Runat="Server" />
</p>
<ASP:ObjectDataSource
ID="SqlDataSource1"
TypeName="System.Web.Caching.SqlCacheDependencyAdmin"
SelectMethod="GetTablesEnabledForNotifications"
Runat="Server" />
<p>
<ASP:Label ID="lblErrorMessage" EnableVIEwState="false"
ForeColor="red" Runat="Server" />
</p>
<ASP:TextBox ID="txtTableName" Runat="Server" />
<ASP:Button Text="Enable Table" OnClick="EnableTable"
Runat="Server" />
</form>
</body>
</Html>
列表 2:EnableSCI.ASPx (Visual Basic .Net)
<%@ Page Language="vb" %>
<%@ Import Namespace="System.Web.Caching" %>
<script runat="server">
Const connectionString As String = "Server=localhost;Database=Pubs"
Sub Page_Load()
If Not IsPostBack Then
SqlCacheDependencyAdmin.EnableNotifications( _
connectionString)
SqlDataSource1.SelectParameters.Add("connectionString", _
connectionString)
End If
End Sub
Sub EnableTable(ByVal s As Object, ByVal e As EventArgs)
Try
SqlCacheDependencyAdmin.EnableTableForNotifications( _
connectionString, txtTableName.Text)
Catch ex As Exception
lblErrorMessage.Text = ex.Message
End Try
txtTableName.Text = ""
End Sub
</script>
<Html>
<head id="Head1" runat="server">
<title>ConfigureSCI</title>
</head>
<body>
<form id="form1" runat="server">
<h1>SQL Cache Invalidation</h1>
以下表格已啟用 SQL Cache Invalidation:
<p>
<ASP:GridVIEw id="grdTables" DataSourceID="SqlDataSource1"
CellPadding="10" ShowHeader="false" Runat="Server" />
</p>
<ASP:ObjectDataSource
ID="SqlDataSource1"
TypeName="System.Web.Caching.SqlCacheDependencyAdmin"
SelectMethod="GetTablesEnabledForNotifications"
Runat="Server" />
<p>
<ASP:Label ID="lblErrorMessage" EnableVIEwState="false"
ForeColor="red" Runat="Server" />
</p>
<ASP:TextBox ID="txtTableName" Runat="Server" />
<ASP:Button ID="Button1" Text="Enable Table"
OnClick="EnableTable" Runat="Server" />
</form>
</body>
</Html>
在列表 2 中,connectionString 常量用於選擇啟用了 SQL Cache Invalidation 的數據庫(如果要為 Pubs 數據庫以外的數據庫啟用 SQL Cache Invalidation,可以更改此常量的值)。在 Page_Load 方法中,調用 SqlCacheDependencyAdmin 類上的 EnableNotifications 方法,為由 connectionString 常量指定的數據庫啟用 SQL Cache Invalidation。
列表 2 中的 GridVIEw 顯示了當前啟用了 SQL Cache Invalidation 的所有數據庫表。GridVIEw 被綁定到 ObjectDataSource 控件上,該控件為其 SelectMethod 調用 GetTablesneabledForNotifications 方法。
最後,您可以使用列表 2 中的頁面為其他表啟用 SQL Cache Invalidation。在文本框中輸入表的名稱並單擊“Enable Table”按鈕時,將調用 EnableTableForNotifications 方法。
SQL Cache Invalidation 的 Web 配置設置
在 ASP.NET 應用程序中使用 SQL Cache Invalidation 之前,下一步要做的是更新您的 Web 配置文件。您需要配置 ASP.Net Framework,以便輪詢啟用了 SQL Cache Invalidation 的數據庫。
列表 3 中的 Web 配置文件包含輪詢 Pubs 數據庫所必需的配置信息。
列表 3:Web.Config
<configuration>
<connectionStrings>
<add name="MySQLServer"
connectionString="Server=localhost;Database=Pubs" />
</connectionStrings>
<system.web>
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add
name="Pubs"
connectionStringName="MySQLServer"
pollTime="60000" />
</databases>
</sqlCacheDependency>
</caching>
</system.web>
</configuration>
列表 3 中的 Web 配置文件包含兩部分。<connectionStrings> 部分用於創建數據庫連接字符串,以連接到名為 MySQLServer 的 Pubs 數據庫。
caching 部分用於配置 SQL Cache Invalidation 輪詢。在 <databases> 子部分中,您可以列出要對其進行輪詢以檢查數據更改的一個或多個數據庫。在列表 3 中,MySQLServer 表示的數據庫每分鐘(每 60000 毫秒)輪詢一次。
您可以為不同的數據庫指定不同的輪詢間隔。每次輪詢數據庫以檢查數據更改時,服務器都必須執行一些操作。如果您認為數據庫中的數據不會頻繁地更改,可以增加輪詢間隔。
在頁面輸出緩存中使用 SQL Cache Invalidation
現在,我們已經完成了 SQL Cache Invalidation 的所有配置步驟,可以在 ASP.Net 頁面中使用它了。一種方法是在頁面輸出緩存中使用 SQL Cache Invalidation。頁面輸出緩存允許您在內存中緩存頁面所顯示的所有內容。通過使用 SQL Cache Invalidation,您可以在(且只在)數據庫表發生更改時自動更新緩存的頁面。
例如,列表 4 中的頁面在 GridVIEw 控件中顯示了 Titles 數據庫表的內容。在該頁面的頂部,OutputCache 指令用於在內存中緩存頁面內容。如果 Titles 數據庫表發生更改,SqlDependency 屬性將使頁面更新。
列表 4:OutputCacheTitles.ASPx
<%@ OutputCache SqlDependency="Pubs:Titles"
Duration="6000" VaryByParam="none" %>
<Html>
<head runat="server">
<title>Output Cache Titles</title>
</head>
<body>
<form id="form1" runat="server">
<%= DateTime.Now %>
<ASP:GridVIEw
ID="grdTitles"
DataSourceID="SqlDataSource1"
Runat="Server" />
<ASP:SqlDataSource
ID="SqlDataSource1"
SelectCommand="Select * FROM Titles"
ConnectionString="<%$ ConnectionStrings:MySQLServer %>"
Runat="Server" />
</form>
</body>
</Html>
請注意,SqlDependency 屬性引用了 Web 配置文件中定義的數據庫的名稱。由於我們指定了每分鐘輪詢一次 Pubs 數據庫以檢查數據更改,因此如果對該數據庫進行了更改,列表 4 中的頁面將在一分鐘之內進行更新。
您可以為 SqlDependency 屬性值列出多個數據庫和/或多個數據庫表。要創建多個依賴關系,只需用分號分隔每個依賴關系即可。
在 DataSource 控件中使用 SQL Cache Invalidation
除了在頁面輸出緩存中使用 SQL Cache Invalidation 之外,還可以直接在 DataSource 控件中使用 SQL Cache Invalidation。如果要在多個頁面中使用相同的數據庫數據,請考慮在 DataSource 控件中使用 SQL Cache Invalidation。SqlDataSource、AccessDataSource 和 ObjectDataSource 控件都支持 SqlCacheDependency 屬性。
例如,列表 5 中的頁面在 SqlDataSource 控件中使用了 SQL Cache Invalidation。
列表 5:SqlDataSourceCaching.ASPx
<Html>
<head id="Head1" runat="server">
<title>SqlDataSource Caching</title>
</head>
<body>
<form id="form1" runat="server">
<%= DateTime.Now %>
<ASP:GridVIEw
ID="grdTitles"
DataSourceId="SqlDataSource1"
Runat="server" />
<ASP:SqlDataSource
ID="SqlDataSource1"
EnableCaching="true"
SqlCacheDependency="Pubs:Titles"
SelectCommand="select * from titles"
ConnectionString="<%$ ConnectionStrings:MySQLServer %>"
Runat="server" />
</form>
</body>
</Html>
在列表 5 中,SqlDataSource 控件是使用 EnableCaching 和 SqlCacheDependency 這兩個屬性聲明的。SqlCacheDependency 屬性使用的語法與 OutputCache 指令的 SqlDependency 屬性相同。您需要列出數據庫的名稱,後跟數據庫表的名稱。
在 Cache 對象中使用 SQL Cache Invalidation
最後,您還可以在 Cache 對象中使用 SQL Cache Invalidation。此選項使您可以最大程度地對 SQL Cache Invalidation 進行編程控制。
要在 Cache 對象中使用 SQL Cache Invalidation,您需要創建一個 SqlCacheDependency 對象實例。使用 Insert 方法在 Cache 中插入新對象時,可以使用 SqlCacheDependency 對象。
例如,列表 6 中的頁面顯示了 Titles 數據庫表中的記錄數。計數是基於對基礎數據庫表的依賴關系進行緩存的。
列表 6:DisplayTitleCount.ASPx (C#)
<%@ Page Language="c#" %>
<%@ Import Namespace="System.Data.SqlClIEnt" %>
<script runat="server">
void Page_Load()
{
int count = 0;
if (Cache["TitleCount"] != null)
{
count = (int)Cache["TitleCount"];
}
else
{
string connectionString =
ConfigurationSettings.ConnectionStrings[
"MySQLServer"].ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new
SqlCommand("SELECT Count(*) FROM Titles", con);
con.Open();
count = (int)cmd.ExecuteScalar();
con.Close();
Cache.Insert("TitleCount", count,
new SqlCacheDependency("Pubs", "Titles"));
}
lblTitleCount.Text = count.ToString();
}
</script>
<Html>
<head runat="server">
<title>Display Title Count</title>
</head>
<body>
<form id="form1" runat="server">
<ASP:Label ID="lblTitleCount" Runat="Server" />
</form>
</body>
</Html>
列表 6:DisplayTitleCount.ASPx (Visual Basic .Net)
<%@ Page Language="vb" %>
<%@ Import Namespace="System.Data.SqlClIEnt" %>
<script runat="server">
Sub Page_Load()
Dim count As Integer = 0
If Not Cache("TitleCount") Is Nothing Then
count = Convert.ToInt32(Cache("TitleCount"))
Else
Dim connectionString As String = _
ConfigurationSettings.ConnectionStrings( _
"MySQLServer").ConnectionString
Dim con As New SqlConnection(connectionString)
Dim cmd As New _
SqlCommand("SELECT Count(*) FROM Titles", con)
con.Open()
count = Convert.ToInt32(cmd.ExecuteScalar())
con.Close()
Cache.Insert("TitleCount", count, _
new SqlCacheDependency("Pubs", "Titles"))
End If
lblTitleCount.Text = count.ToString()
End Sub
</script>
<Html>
<head id="Head1" runat="server">
<title>Display Titles Count</title>
</head>
<body>
<form id="form1" runat="server">
<ASP:Label ID="lblTitleCount" Runat="Server" />
</form>
</body>
</Html>
返回頁首
使用 Post-Cache Substitution
在許多情況下,您需要緩存頁面的一部分,而不是整個頁面。例如,在您的 Web 站點主頁上,您可能希望同時顯示隨機的標題廣告和數據庫表中的記錄。如果緩存整個頁面,每個用戶都將在每次請求的頁面上看到同一個標題廣告。
要處理這種同時混有動態內容和緩存內容的問題,一種方法是使用 Web 用戶控件。因為可以為 Web 用戶控件添加 OutputCache 指令,所以即使不緩存包含頁面的內容,也可以緩存 Web 用戶控件的內容。
但有時候可能會事與願違。雖然您可以使用 Web 用戶控件在動態頁面上添加緩存的內容,但很多情況下,您實際上是想在緩存的頁面中添加動態內容。例如,假設您要緩存整個頁面的內容,只留一小塊區域用於顯示當前用戶的用戶名。這種情況下最好使用 Post-Cache Substitution。
ASP.Net 2.0 Framework 引入了一種新控件,稱為 Substitution 控件。您可以使用 Substitution 控件在緩存的頁面中插入動態內容。列表 7 中的頁面使用 Substitution 控件將用戶名插入到緩存的內容中(參見圖 3)。