SQL 缓存依赖

作用

使用SQL 缓存依赖技术,可以实现当应用程序中对应的数据库中的数据发生改变时

才清除应用程序中对应的缓存,最大化的提高程序的性能。

实现方法:


 

一、创建数据库

a)         数据库不能为动态附加的模式

b)        启用数据库中的消息传送功能

alterdatabase CacheDependencyTest set

“CacheDependencyTest”为自己建的数据库

二、在应用程序中合使用SQL 缓存依赖技术

a)         建立一个Global.asax文件,在其中的“Application_Start”方法添加下面代码:
//当程序运行时启动sql缓存依赖监听
            string connString = ConfigurationManager.ConnectionStrings["CacheDependencyTestConnectionString"].ConnectionString;
            SqlDependency.Start(connString);

 

 
b)        在要使用缓存的页面中使用缓存依赖

 
        protectedvoid Page_Load(object sender, EventArgs
        {
            //select  语句必须包含确切的列名,表名也要加上所属用户名,
            //例如下面dbo.CacheTable表的dbo就不能略去
            string sql = "SELECT UserName FROM dbo.CacheTable";

 
            string connstring=ConfigurationManager
                .ConnectionStrings["CacheDependencyTestConnectionString"]
                .ConnectionString;
            SqlConnection conn=new SqlConnection(connstring);
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
             DataTable dt = new DataTable();
             // 创建一个SQL缓存依赖,要用一个selectCommand做为参数
                System.Web.Caching.SqlCacheDependency
                    = new System.Web.Caching.SqlCacheDependency(da.SelectCommand);
                
            //将数据库中的数据填到dt中,要创建完缓存依赖后才可以填数据
                da.Fill(dt);

 
            //如果缓存中没有dt这个表,就将表dt添加缓存中
            if (Cache["CacheTable"] == null) {              
                Cache.Insert(
                    "CacheTable"//缓存名
                    , dt//要缓存的对象,这里是一个DataTable
                    , denpendency//sql缓存依赖对象
                    //缓存过期时间,这里设置为永不过期.
                    //所以会一直到数据库中的表数据发生更改时才会清除缓存
                    ,System.Web.Caching.Cache.NoAbsoluteExpiration
                    //滑动时间,这里设置为0;
                    //如果设置为5,代表如果你5秒钟内没有发请求,就从缓存中清除
                    , TimeSpan.Zero
                    );
                //测试用的,这样在界面才知道数据是不是从缓存读取
                this.lblFlag.Text = "out of cache"+DateTime.Now.ToString();
            }
            else
            {
                this.lblFlag.Text = "use cache" + DateTime.Now.ToString();
            }                  
             //重缓存中读取数据
            this.GridView1.DataSource = Cache["CacheTable"] as DataTable;
            this.GridView1.DataBind();            
        }

 

 

 
c)        页面代码:
<%@Page Language="C#" AutoEventWireup="true" CodeBehind="AppCache.aspx.cs" Inherits="cacheTest.AppCache" %>

 
<!DOCTYPEhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 
<htmlxmlns="http://www.w3.org/1999/xhtml" >
<headrunat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="lblFlag" runat="server"></asp:Label>
        <asp:GridView ID="GridView1" runat="server">
        </asp:GridView>
        
    </div>
    </form>
</body>
</html>