SQL 缓存依赖

 

作用

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

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

实现方法:

 

一、创建数据库

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

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

alter database CacheDependencyTest set enable_broker

“CacheDependencyTest”为自己建的数据库

d)修改数据库
ALTER DATABASE DB SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE DB SET ENABLE_BROKER;
 
SELECT is_broker_enabled FROM sys.databases WHERE name = 'DB'

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

a)         建立一个Global.asax文件,在其中的“Application_Start”方法添加下面代码:

//当程序运行时启动sql缓存依赖监听

            string connString = ConfigurationManager.ConnectionStrings["CacheDependencyTestConnectionString"].ConnectionString;

            SqlDependency.Start(connString);

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

 1       protected void Page_Load(object sender, EventArgs e)
 2 
 3         {
 4 
 5             //select  语句必须包含确切的列名,表名也要加上所属用户名,
 6 
 7             //例如下面dbo.CacheTable表的dbo就不能略去
 8 
 9             string sql = "SELECT UserName FROM dbo.CacheTable";
10 
11  
12 
13             string connstring=ConfigurationManager
14 
15                 .ConnectionStrings["CacheDependencyTestConnectionString"]
16 
17                 .ConnectionString;
18 
19             SqlConnection conn=new SqlConnection(connstring);
20 
21             SqlDataAdapter da = new SqlDataAdapter(sql, conn);
22 
23              DataTable dt = new DataTable();
24 
25              // 创建一个SQL缓存依赖,要用一个selectCommand做为参数
26 
27                 System.Web.Caching.SqlCacheDependency denpendency
28 
29                     = new System.Web.Caching.SqlCacheDependency(da.SelectCommand);
30 
31                
32 
33             //将数据库中的数据填到dt中,要创建完缓存依赖后才可以填数据
34 
35                 da.Fill(dt);
36 
37  
38 
39             //如果缓存中没有dt这个表,就将表dt添加缓存中
40 
41             if (Cache["CacheTable"] == null) {             
42 
43                 Cache.Insert(
44 
45                     "CacheTable"//缓存名
46 
47                     , dt//要缓存的对象,这里是一个DataTable
48 
49                     , denpendency//sql缓存依赖对象
50 
51                     //缓存过期时间,这里设置为永不过期.
52 
53                     //所以会一直到数据库中的表数据发生更改时才会清除缓存
54 
55                     ,System.Web.Caching.Cache.NoAbsoluteExpiration
56 
57                     //滑动时间,这里设置为0;
58 
59                     //如果设置为5,代表如果你5秒钟内没有发请求,就从缓存中清除
60 
61                     , TimeSpan.Zero
62 
63                     );
64 
65                 //测试用的,这样在界面才知道数据是不是从缓存读取
66 
67                 this.lblFlag.Text = "out of cache"+DateTime.Now.ToString();
68 
69             }
70 
71             else
72 
73             {
74 
75                 this.lblFlag.Text = "use cache" + DateTime.Now.ToString();
76 
77             }                 
78 
79              //重缓存中读取数据
80 
81             this.GridView1.DataSource = Cache["CacheTable"] as DataTable;
82 
83             this.GridView1.DataBind();           
84 
85         }

 

 

 

 

c)        页面代码:

View Code
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AppCache.aspx.cs" Inherits="cacheTest.AppCache" %>

 

<!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></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>

 

posted @ 2013-04-01 09:44  L嗜血幽灵  阅读(184)  评论(0编辑  收藏  举报