Enterprise Library 4.1学习笔记7----缓存应用程序块之SqlDependency

简介: 本文是在Artech“[原创]Enterprise Library深入解析与灵活应用(2): 通过SqlDependency实现Cache和Database的同步”的基础之上,将其示例移植到webform环境中而已,详细原理还请大家见Artech的文章  应用场景:利用Enlib4.1的缓存模块,实现常用数据的缓存,同时借助SqlDependency通过"监控数据是否有改动"来决定缓存是不是过期。

本文是在Artech“[原创]Enterprise Library深入解析与灵活应用(2): 通过SqlDependency实现Cache和Database的同步”的基础之上,将其示例移植到webform环境中而已,详细原理还请大家见Artech的文章 

应用场景:利用Enlib4.1的缓存模块,实现常用数据的缓存,同时借助SqlDependency通过"监控数据是否有改动"来决定缓存是不是过期。

1.测试数据表及数据(sql2005环境)

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif
 1img_a6339ee3e57d1d52bc7d02b338e15a60.gifCREATE TABLE [dbo].[Messages](
 2img_a6339ee3e57d1d52bc7d02b338e15a60.gif    [ID] [int] IDENTITY(1,1NOT NULL,
 3img_a6339ee3e57d1d52bc7d02b338e15a60.gif    [UserID] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
 4img_a6339ee3e57d1d52bc7d02b338e15a60.gif    [Message] [nvarchar](256) COLLATE Chinese_PRC_CI_AS NOT NULL,
 5img_a6339ee3e57d1d52bc7d02b338e15a60.gif CONSTRAINT [PK_Messages] PRIMARY KEY CLUSTERED 
 6img_a6339ee3e57d1d52bc7d02b338e15a60.gif(
 7img_a6339ee3e57d1d52bc7d02b338e15a60.gif    [ID] ASC
 8img_a6339ee3e57d1d52bc7d02b338e15a60.gif)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ONON [PRIMARY]
 9img_a6339ee3e57d1d52bc7d02b338e15a60.gifON [PRIMARY]
10img_a6339ee3e57d1d52bc7d02b338e15a60.gif
11img_a6339ee3e57d1d52bc7d02b338e15a60.gifGO
12img_a6339ee3e57d1d52bc7d02b338e15a60.gifSET ANSI_PADDING OFF
13img_a6339ee3e57d1d52bc7d02b338e15a60.gif
14img_a6339ee3e57d1d52bc7d02b338e15a60.gif
15img_a6339ee3e57d1d52bc7d02b338e15a60.gifInsert Into [Messages](UserID,[Message]values('JIMMY','Test Message1');
16img_a6339ee3e57d1d52bc7d02b338e15a60.gifInsert Into [Messages](UserID,[Message]values('Jack','AAAAAA');

 

2.实现自己的SqlDependencyCacheItemExpiration类,这里直接用Artech的代码,就不重复贴出来了


3.webform调用

 

 1  using  System;
 2  using  System.Collections.Generic;
 3  using  System.Data;
 4  using  System.Data.Common;
 5  using  Microsoft.Practices.EnterpriseLibrary.Caching;
 6  using  Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
 7  using  Microsoft.Practices.EnterpriseLibrary.Data;
 8 
 9  namespace  WebApp
10  {
11       public   partial   class  _Default : System.Web.UI.Page
12      {
13 
14           string  CacheKey = " JIMMY_Message_SqlDependency_Cache " ;
15         
16 
17           protected   void  Page_Load( object  sender, EventArgs e)
18          {
19               if  ( ! IsPostBack) 
20              {
21                   this .Repeater1.DataSource  =  GetMessages( " JIMMY " );
22                   this .Repeater1.DataBind();
23              }           
24          }
25 
26           ///   <summary>
27           ///  从数据库实时查询指定用户的Message
28           ///   </summary>
29           ///   <param name="userName"></param>
30           ///   <param name="sql"></param>
31           ///   <returns></returns>
32           private  DataTable GetMessageByUserId( string  userName, string  sql) 
33          {
34              Database db  =  DatabaseFactory.CreateDatabase();
35               if  (sql.Length == 0
36              {
37                  sql  =   " Select [ID],[UserID],[Message] From [dbo].[Messages] Where [UserID]=@UserID " ;
38              }
39              DbCommand command  =  db.GetSqlStringCommand(sql);
40              db.AddInParameter(command,  " UserID " , DbType.String, userName);
41               return  db.ExecuteDataSet(command).Tables[ 0 ];
42          
43          }
44 
45           ///   <summary>
46           ///  获取用户的Message(缓存优先,数据库其次)
47           ///   </summary>
48           ///   <param name="userName"></param>
49           ///   <returns></returns>
50           private  DataTable GetMessages( string  userName)
51          {
52              ICacheManager manager  =  CacheFactory.GetCacheManager();
53               if  (manager.GetData(CacheKey)  ==   null )
54              {
55                   string  sql  =   " Select [ID],[UserID],[Message] From [dbo].[Messages] Where [UserID]=@UserID " ;
56 
57                  Dictionary < string object >  Dic  =   new  Dictionary < string object > ();
58                  Dic.Add( " UserID " , userName);
59                  manager.Add(CacheKey, GetMessageByUserId(userName, sql), CacheItemPriority.Normal,  null new  SqlDependencyExpiration(sql,CommandType.Text, Dic));
60              }
61              
62               return  manager.GetData(CacheKey)  as  DataTable;
63          }
64      }
65  }
66 

 

测试方法:

上面的示例中,缓存了[dbo].[Messages].[UserID]='JIMMY'的数据,如果首次打开页面时,直接从数据库中取数据,然后刷新一下,从Sql监视器中能看到此时并没有提交查询语句,即直接从缓存中读取数据。

然后在数据库中,直接UserID='JIMMY'的记录(比如修改Message字段值),再次刷新页面,会发现重新向数据库提交了查询语句(即更新了缓存),然后再次刷新,直接从缓存读取。

最后在数据库中,修改UserID<>'JIMMY'的记录,再次刷新页面,还是从缓存中数据(即修改UserID不为JIMMY的记录,不会触发SqlDependency的OnChange事件,缓存未过期)

 

源代码下载:http://files.cnblogs.com/yjmyzz/SqlDependency_Cache_Test.rar

 

目录
相关文章
|
7月前
|
缓存 Java 数据库
优化您的Spring应用程序:缓存注解的精要指南
优化您的Spring应用程序:缓存注解的精要指南
114 0
|
7月前
|
缓存 监控 中间件
中间件Cache-Aside策略应用程序直接与缓存和数据库进行交互
【5月更文挑战第8天】中间件Cache-Aside策略应用程序直接与缓存和数据库进行交互
85 4
|
7月前
|
存储 缓存 移动开发
HTML5 应用程序缓存
HTML5的离线缓存(Application Cache)允许网页存储资源以实现离线访问。通过manifest文件指定缓存内容和更新规则,比如列出要缓存的HTML、CSS、JS和图片。在HTML中引用manifest文件后,浏览器会根据文件变化更新缓存。但要注意,应用缓存不自动更新,需手动修改manifest触发,并且现代Web开发更多使用服务工作者(Service Workers)替代,以获得更优的离线体验和更新策略。
|
7月前
|
缓存 NoSQL 关系型数据库
数据库缓存一致性学习笔记(一)
数据库缓存一致性学习笔记(一)
|
缓存 前端开发
前端学习笔记202306学习笔记第四十七天-vue-强制缓存3
前端学习笔记202306学习笔记第四十七天-vue-强制缓存3
74 0
|
7月前
|
存储 缓存 前端开发
《Webpack5 核心原理与应用实践》学习笔记-> webpack5持久化缓存
《Webpack5 核心原理与应用实践》学习笔记-> webpack5持久化缓存
275 1
|
缓存 NoSQL 算法
Redis学习笔记-缓存容量和淘汰机制核心思想
Redis学习笔记-缓存容量和淘汰机制核心思想
146 0
|
消息中间件 缓存 NoSQL
Redis学习笔记-如何解决缓存和数据库的数据不一致
Redis学习笔记-如何解决缓存和数据库的数据不一致
197 0
|
缓存 NoSQL 数据库
Redis学习笔记-如何应对缓存雪崩、击穿、穿透
Redis学习笔记-如何应对缓存雪崩、击穿、穿透
63 0
|
缓存 前端开发
前端学习笔记202306学习笔记第四十七天-vue-强制缓存2
前端学习笔记202306学习笔记第四十七天-vue-强制缓存2
83 0