Asp.net2.0和sqlserver配合进行缓存有2种方式:轮询、查询通知。
轮询-----------主要是针对SQL (7.0, 2000, 2005);
查询通知-----只针对Sql2005。
SqlCacheDependency,要实现该功能,需要采用如下步骤:
1在.net framework 2.0的安装目录下(默认是WINNT\Microsoft.NET\Framework\v2.0.40607),启动一个叫aspnet_regsql.exe的命令行工具,比如:
aspnet_regsql -S localhost –U sa –P 123456 -d Pubs –ed
上面的意思是,指定了本地的数据库服务器localhost,并指定了登陆的用户名和密码,并用参数-d指定了要采用哪一个数据库(这里是指定了pubs)数据库,-ed参数表示是允许该数据库使用sqlcachedependency功能。
接着,我们需要指定对哪一个表使用数据sqlcachedependency功能,如:
aspnet_regsql -S localhost –U sa -P 123456 -ed -d pubs -et -t authors
上面语句的意思是,指定对pubs数据库中的authors表使用sqlcachedependency功能,-t参数后是表的名称,-et是允许该表使用sqlcachedependency功能。其他的有关参数简单介绍如下:
参数 |
参数意义 |
-? |
显示该工具的帮助功能. |
-S |
后接的参数为数据库服务器的名称或者IP地址 |
-U |
后接的参数为数据库的登陆用户名. |
-P |
后接的参数为数据库的登陆密码 |
-E |
当使用windows集成验证时,使用该功能 |
-t |
后接参数为对哪一个表采用sqlcachedependency功能。 |
-d |
后接参数为对哪一个数据库采用sqlcachedependency功能 |
-ed |
允许对数据库使用sqlcachedependency功能 |
-dd |
禁止对数据库采用sqlcachedependency功能 |
-et |
允许对数据表采用sqlcachedependency功能 |
-dt |
禁止对数据表采用sqlcachedependency功能 |
-lt |
列出当前数据库中有哪些表已经采用sqlcachedependency功能 |
Sqlcachedependency的的原理简单来说,是采用aspnet_regsql这个专门工具,预先设定要监视的数据库和表,并在数据库中增加一个专门的表,打开数据库,会发现多了一个数据表aspnet_sqlcachetablesforchangenotification.
|
这个表有三个字段,“tableName”记录要追踪的数据表的名称,“notificationCreated”记录开始追踪的时间,“changeId”是一个int类型的字段,每当追踪的数据表的数据发生变化时,这个字段的值就加1。 此外还会在指定的数据库中增加几个存储过程,用来让ASP.NET引擎查询追踪的数据表的情况,并给要使用 Sqlcachedependency 的表加上若干触发器,分别对应到Insert、Update、Delete操作。ASP.NET引擎通过执行它加上的存储过程“AspNet_SqlCachePollingStoredProcedure”,这个存储过程直接返回“AspNet_SqlCacheTablesForChangeNotification”表的内容,让ASP.NET引擎知道哪个表的数据发生的变化。
查询通知方式编程步骤:
与基于轮询的失效不同,无需在应用程序的配置中注册任何 <sqlCacheDependency>。而且,无需使用 aspnet_regsql.exe 工具进行任何特殊配置。
基于通知的依赖项是使用字符串 CommandNotification 在 OutputCache 指令上 配置的。此值告知 ASP.NET 应为页或数据源控件创建基于通知的 依赖项。
在页上:
<%@ OutputCache Duration="999999" SqlDependency="CommandNotification" VaryByParam="none" %>
在数据源控件上:
<asp:SqlDataSource EnableCaching="true" SqlCacheDependency="CommandNotification" CacheDuration="Infinite" ... />
在首次执行某 SQL 查询之前,必须在应用程序某处调用 System.Data.SqlClient.SqlDependency.Start() 方法。此方法应放在 global.asax 文件的 Application_Start() 事件中。
使用 SqlCacheDependencyAdmin 类
aspnet_regsql 实际上也是在后台使用 SqlCacheDependencyAdmin 类的方法来配置 Microsoft SQL Server。可以直接从 ASP.NET 页面中使用此类的方法。
SqlCacheDependencyAdmin 类具有五个重要的方法:
• |
DisableNotifications — 为特定数据库禁用 SQL Cache Invalidation。 |
• |
DisableTableForNotifications — 为数据库中的特定表禁用 SQL Cache Invalidation。 |
• |
EnableNotifications — 为特定数据库启用 SQL Cache Invalidation。 |
• |
EnableTableForNotifications — 为数据库中的特定表启用 SQL Cache Invalidation。 |
• |
GetTablesEnabledForNotifications — 返回启用了 SQL Cache Invalidation 的所有表的列表。 |
需要注意的是,SQL Cache Invalidation 只能用于 Microsoft SQL Server 7 及更高版本,不能用于其他数据库,例如 Microsoft Access 或 Oracle。
列表 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 id="Head1" 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 ID="Button1" Text="Enable Table" OnClick="EnableTable"
Runat="Server" />
</form>
</body>
</html>
应用
Web.config <connectionStrings> <add name="MyConn" connectionString="server=192.168.1.23;database=carsea;uid=sa;pwd=;" providerName="System.Data.SqlClient"/> </connectionStrings> <system.web> <!-- 定义缓存策略--> <caching> <sqlCacheDependency enabled="true" pollTime="10000"> <databases> <!-- name:必需的 String 属性。 要添加到配置集合中的 SqlCacheDependencyDatabase 对象的名称。 此名称用作 @ OutputCache 指令上 SqlDependency 属性的一部分。 pollTime:设置 SqlCacheDependency 轮询数据库表以查看是否发生更改的频率(以毫秒计算)。这儿是一个测试,所以设为10秒,请加大此值 --> <add connectionStringName="MyConn" name="board"/> </databases> </sqlCacheDependency> </caching> </system.web> |
using System.Web.Caching; string key = "model_type_" + type; //从缓存中取值 CBoardInfo model = (CBoardInfo)HttpRuntime.Cache[key]; if (model == null) { //取数据 model = new CBoardTask().GetModelByType(type); //启用更改通知 SqlCacheDependencyAdmin.EnableNotifications( ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString); //连接到 SQL Server 数据库并为 SqlCacheDependency 更改通知准备数据库表 SqlCacheDependencyAdmin.EnableTableForNotifications( ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString, "board"); //制定缓存策略 SqlCacheDependency scd = new SqlCacheDependency("board", "board"); //插入缓存 HttpRuntime.Cache.Insert(key, model, scd); } return model; |