SqlDependency和ASP.NET缓存(摘录)

摘自微软技术丛书

ADO.NET 2.0技术内幕

清华大学出版社

(美)David Sceppa 著

贾洪峰 译

第590页

 

SqlDependency类的最常见应用是与ASP.NET缓存进行交互。

每次加载页面时,代码会检查缓存中是否存在包含期望结果的项,通常是在DataTable中。如果该项存在,代码只是依赖该项来显示DataTable中的内容而不是重新查询数据库。如果该项不存在, 则代码查询数据库,在ASP.NET缓存中缓存结果,然后显示这些结果。

在SQL Server通知服务之前,这一方法的难题被浓缩为一个问题:查询结果应当在缓存中存在多长时间?一分钟,一小时,还是一周?如果选择过短的间隔,将会不必要地重新查询数据库以获取并未发生变化的数据。如果选择过长的间隔,则应用程序中显示的结果不再准确。

SQL Server通知服务和SqlDependency类极大地简化了该情景。在执行该查询之前,创建一个引用此查询的SqlDependency对象。还可以为SqlDependency的OnChange事件添加处理程序。在此处理程序中,只需要将查询结果从ASP.NET缓存中清除出去。现在ASP.NET应用程序将继续依赖与所缓存的结果,直到查询结果发生变化为止。

以下代码段说明了这种方法。

    string key = "CategoryNames";
    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable tbl = (DataTable)Cache[key];
        if (tbl == null)
        {
            Response.Write("Executing query<p>");
            tbl = FecthAndCacheCategories();
        }
        else
        {
            Response.Write("Using cached data<p>");
        }
        categoryNamesGrid.DataSource = tbl;
        categoryNamesGrid.DataBind();
    }

    private DataTable FecthAndCacheCategories() 
    {
        string strConn, strSQL;
        strConn = "Data Source=.\SQLExpress;Initial Catalog = Northwind;Integrated Security=True;";
        strSQL ="select CategoryName from dbo.Categories";
        SqlDependency.Start(strConn);
        SqlDataAdapter da = new SqlDataAdapter(strSQL,strConn);
        SqlDependency dep = new SqlDependency(da.SelectCommand);
        dep.OnChange+= new OnChangeEventHandler(MyOnChangeHandler);
        DataTable tbl = new DataTable();
        da.Fill(tbl);
        Cache[key] = tbl;
        return tbl;
    }

    void MyOnChangeHandler(object sender,SqlNotificationEventArgs e)
    {
        Cache.Remove(key);
    }

SqlCacheDependency类

在上述情况下,SqlDependency类有一个小缺点:您可能会发现自己过于频繁地使用这个类与ASP.NET缓存进行交互,使通过编写代码来处理OnChange事件,以从缓存中清除项的过程可能变得非常乏味。

ASP.NET小组创建了一个类来帮助解决这一问题——SqlCacheDependency类。可以像SqlDependency一样创建SqlCacheDependency类的实例——提供要执行的SqlCommand。SqlCacheDependency类没有为这种情况公开OnChange事件,也没有公开任何事件。事实上,不需要处理任何事件,也不需要自己来创建处理程序和清除该项。

SqlDependency类存在于System.Web.Caching命名空间中,它派生于CacheDependency类,这个类是专门用来与ASP.NET缓存进行交互的。所以,如果将DataTable添加到ASP.NET缓存并提供SqlCacheDependency对象,当查询结果发生变化时,DataTable将自动从缓存中清除。

可以使用SqlCacheDependency类,以下面的更简单的代码来替代FetchAndCacheCategories过程。

    private DataTable FecthAndCacheCategories()
    {
        string strConn, strSQL;
        strConn = "Data Source=.\SQLExpress;Initial Catalog = Northwind;Integrated Security=True;";
        strSQL ="select CategoryName from dbo.Categories";
        SqlDependency.Start(strConn);
        SqlDataAdapter da = new SqlDataAdapter(strSQL,strConn);
        SqlCacheDependency dep = new SqlCacheDependency(da.SelectCommand);
        //dep.OnChange+= new OnChangeEventHandler(MyOnChangeHandler);
        DataTable tbl = new DataTable();
        da.Fill(tbl);
        Cache.Add(key,tbl,dep,Caching.Cache.NoAbsoluteExpiration,Caching.Cache.NoSlidingExpiration,CacheItemPriority.Default,null);
        return tbl;
    }
posted @ 2009-12-01 21:01  济阳补丁  阅读(595)  评论(0编辑  收藏  举报