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) 页面代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<%@ 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>