三.使用基于轮询的SQL缓存依赖
ASP.NET2.0新增了一个功能非常强大的SQL缓存依赖功能。该功能允许在指定的数据库中发生数据更改时,自动地重新从数据库中载入数据。
在使用基于轮询的缓存依赖之前,必须执行下面两个步骤的配置:
(1)必须对数据库及其中的若干个数据表启用SQL缓存依赖;
(2)必须在Web.config配置文件中配置SQL缓存依赖。
1.配置数据库
(1)对数据库启用SQL缓存依赖
F:">aspnet_regsql -E -S . -ed -d Northwind
为 SQL 缓存依赖项启用该数据库。
.
已完成。
F:"> |
或者:
F:">aspnet_regsql -C "data source=.;initial catalog=Test;integrated security=ssp
i" -ed
为 SQL 缓存依赖项启用该数据库。
.
已完成。
F:"> |
(2)对数据表启用SQL缓存依赖
F:">aspnet_regsql -E -S . -ed -d Northwind -et -t Categories
为 SQL 缓存依赖项启用该数据库。
.
已完成。
为 SQL 缓存依赖项启用该表。
已完成。
F:"> |
或者:
F:">aspnet_regsql -C "data source=.;initial catalog=Test;integrated security=ssp
i" -et -t Categories
为 SQL 缓存依赖项启用该数据库。
.
已完成。
为 SQL 缓存依赖项启用该表。
已完成。
F:"> |
2.配置Web.config配置文件
<system.web>
<caching>
<sqlCacheDependencyenabled="true"pollTime="5000">
<databases>
<addname="Northwind"
connectionStringName="NorthwindConnectionString"/>
</databases>
</sqlCacheDependency>
</caching>
</system.web> |
3.对页面输出缓存使用基于轮询的SQL缓存依赖
PollingSqlOutputCache.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile=" PollingSqlOutputCache.aspx.cs" Inherits="PollingSqlOutputCache" %>
<%@ OutputCache Duration="999999" VaryByParam="none" SqlDependency="Northwind:Categories" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>对页面输出缓存使用基于轮询的SQL缓存依赖</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="CategoryID"
DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="CategoryID" HeaderText="CategoryID" InsertVisible="False"
ReadOnly="True" SortExpression="CategoryID" />
<asp:BoundField DataField="CategoryName" HeaderText="CategoryName" SortExpression="CategoryName" />
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT [CategoryID], [CategoryName], [Description] FROM [Categories]">
</asp:SqlDataSource>
</div>
</form>
</body>
</html> |
4.对DataSource缓存使用基于轮询的SQL缓存依赖
PollingDataSourceCache.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile=" PollingDataSourceCache.aspx.cs" Inherits="PollingDataSourceCache" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>对DataSource缓存使用基于轮询的SQL缓存依赖</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="CategoryID"
DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="CategoryID" HeaderText="CategoryID" InsertVisible="False"
ReadOnly="True" SortExpression="CategoryID" />
<asp:BoundField DataField="CategoryName" HeaderText="CategoryName" SortExpression="CategoryName" />
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
EnableCaching="true"
SqlCacheDependency="Northwind:Categories"
SelectCommand="SELECT [CategoryID], [CategoryName], [Description] FROM [Categories]">
</asp:SqlDataSource>
</div>
</form>
</body>
</html> |
5.对数据缓存使用基于轮询的SQL缓存依赖
PollingDataCache.aspx:
略……
PollingDataCache.aspx.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Web.Configuration;
using System.Web.Caching;
public partial class PollingDataCache : System.Web.UI.Page
{
private DataTable GetCategories()
{
string strConn =
WebConfigurationManager.
ConnectionStrings["NorthwindConnectionString"].
ConnectionString;
string strSql = "select CategoryID,CategoryName from Categories";
SqlConnection cn = new SqlConnection(strConn);
SqlDataAdapter da =
new SqlDataAdapter(strSql, cn);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = (DataTable)Cache["Category"];
if (dt == null)
{
dt = GetCategories();
SqlCacheDependency dep =
new SqlCacheDependency("Northwind", "Categories");
Cache.Insert("Category", dt, dep);
}
GridView1.DataSource = dt;
GridView1.DataBind();
}
} |
缓存应用程序页面和数据(三)
四.使用基于通知的SQL缓存依赖
优点:ASP.NET应用程序不必定时地访问数据库以查看是否有数据的修改。
缺点(限制):
l 查询必须使用两部分的表名(例如:dbo.Northwind)
l 查询必须包含一个显式的列名列表(不能使用*)
l 查询不能引用视图、继承表、临时表或表变量
l 查询不能引用大对象类型,如text、ntext、p_w_picpath列等
l 查询不能包含子查询、外连接等
l 查询不能使用distinct、compute、compute by或者insert关键字
l 查询不能使用聚合函数
可以对推SQL缓存依赖使用存储过程,但是,每一个存储过程中的SELECT语句必须满足上述的条件。
第一步:配置数据库启用SQL Server2005 Service Broker。
第二步:配置应用程序开始监听通知。
1.为推SQL缓存依赖配置数据库
(1)执行下面的查询来检查Service Broker是否已经为特定的数据库激活:
SELECT name,is_broker_enabled FROM sys.databases |
(2)如果没有开启,则执行alter database命令来启用它:
ALTER DATABASE Northwind SET ENABLE_BROKER |
(3)最后,ASP.NET进程必须有足够的权限来订阅查询通知。
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO "COMPUTENAME"ASPNET" |
2.为推SQL缓存依赖配置应用程序
在应用程序可以接收到变更通知之前,必须启用查询通知监听器。在Global.asax文件中启用监听器。
Global.asa:
<%@ Application Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web.Configuration" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
string strConn =
WebConfigurationManager.
ConnectionStrings["TestConnectionString"].
ConnectionString;
SqlDependency.Start(strConn);
}
void Application_End(object sender, EventArgs e)
{
string strConn =
WebConfigurationManager.
ConnectionStrings["TestConnectionString"].
ConnectionString;
SqlDependency.Stop(strConn);
}
void Application_Error(object sender, EventArgs e)
{
}
void Session_Start(object sender, EventArgs e)
{
}
void Session_End(object sender, EventArgs e)
{
}
</script> |
转载于:https://blog.51cto.com/zhangleiy/367862