五、数据库缓存依赖

      上一篇返回目录 | 下一篇

      对于普通文件的读取,上一篇的缓存已经足够了,但是平时更多的是和数据库进行交互,所以,本篇的这个缓存相对来说,要重要一些。数据库依赖缓存在.NET平台下面有很好的解决方案:SQLCacheDependency,相对于上面的文件缓存来说,这个实现要稍微复杂一点,代码如下(我使用的是Temp数据库,内建表:tbl_Cache,字段任意,并且任意添加了一行数据):

      首先修改web.config,添加连接字符串,并且在system.web中配置使其支持数据库缓存依赖。

ContractedBlock.gif ExpandedBlockStart.gif 数据库连接字符串
1 <connectionStrings>
2     <clear />
3     <add name="LocalSqlServer" connectionString="data source=.;Initial Catalog=Temp;User ID=sa;Password=123456"  providerName="System.Data.SqlClient" />
4 </connectionStrings>

 

ContractedBlock.gif ExpandedBlockStart.gif 在system.web中配置
 1 <caching>
 2   
 3   <sqlCacheDependency enabled="true" pollTime="6000">
 4     <databases>
 5       <clear />
 6       <add name="TestCache" connectionStringName="LocalSqlServer" />
 7     </databases>
 8   </sqlCacheDependency>
 9   
10 </caching>

 

      在配置完web.config之后,需要开启数据库的缓存依赖功能。这里需要用到的是aspnet_regsql.exe这个工具,该工具位于Windows\Microsoft.NET\Framework\[版本]文件夹中,不过不是直接执行该工具,而是通过命令模式来运行。

      在点击了开始——运行,输入cmd回车之后,在命令提示符窗口输入:

aspnet_regsql -C "data source=.;initial catalog=Temp;user id=sa;password=123456" -ed -et -t "tbl_Cache"

      然后回车,可以看到如下图所示窗口:

 

      执行完之后,就为数据库打开的缓存依赖功能,并且在该数据库内还会出现一个名曰“AspNet_SqlCacheTablesForChangeNotification”的表,该表记录的就是您需要监视的数据库的变动情况。
 
      对于该工具,后面的参数详细的解释如下所示:
 
ContractedBlock.gif ExpandedBlockStart.gif aspnet_regsql.exe 参数解释
 1 要使得7.0或者2000版本以上的SQLServer支持SqlCacheDependency特性,需要对数据库服务器执行相关的配置。
 2 
 3 有两种方法配置SQLServer:
 4 
 5 一 使用aspnet_regsql命令行工具。
 6 二 使用SqlCacheDependencyAdmin类。
 7 
 8 例如:
 9 
10 aspnet_regsql -"server" --"database" –ed  或者
11 aspnet_regsql -"server" --"database" -et -"table"
12 
13 如果是Sql验证的话要把-E换成,-U (用户名),-P (密码)
14 
15 以下是该工具的命令参数说明:
16 
17 -? 显示该工具的帮助功能;
18 -S 后接的参数为数据库服务器的名称或者IP地址;
19 -U 后接的参数为数据库的登陆用户名;
20 -P 后接的参数为数据库的登陆密码;
21 -E 使用当前登录用户的 Windows 集成认证进行身份验证。
22 -d 后接参数为对哪一个数据库采用SqlCacheDependency功能;
23 -C 连接数据库的连接字符串。如果您指定服务器(-S)和登录(-U和-P,或 -E)信息,则此选项不是必需的,因为连接字符串已经包含这些信息。
24 
25 -t 后接参数为对哪一个表采用SqlCacheDependency功能;
26 -ed 允许对数据库使用SqlCacheDependency功能;
27 -dd 禁止对数据库采用SqlCacheDependency功能;
28 -et 允许对数据表采用SqlCacheDependency功能;
29 -dt 禁止对数据表采用SqlCacheDependency功能;
30 -lt 列出当前数据库中有哪些表已经采用sqlcachedependency功能。
 
      接下来就开始编码,在代码中使用缓存。
ContractedBlock.gif ExpandedBlockStart.gif 在代码中使用数据库缓存依赖
 1 /// <summary>
 2 /// 根据索引键值从缓存中获取对象
 3 /// </summary>
 4 /// <param name="cacheKey">索引键值</param>
 5 /// <returns>缓存的对象</returns>
 6 private static object GetObjectFromCache(string cacheKey)
 7 {
 8     Cache cache = HttpRuntime.Cache;
 9     return cache[cacheKey];
10 }
11 
12 /// <summary>
13 /// 将对象以cacheKey为索引键值添加到缓存中
14 /// </summary>
15 /// <param name="cacheKey">索引键值</param>
16 /// <param name="obj">需要缓存的对象</param>
17 private static void AddObjectToCache(string cacheKey, object obj, CacheDependency dependencies)
18 {
19     Cache cache = HttpRuntime.Cache;
20     //cache.Insert(cacheKey, obj, dependencies,
21     //             Cache.NoAbsoluteExpiration,
22     //             Cache.NoSlidingExpiration,
23     //             CacheItemPriority.Default, null);
24     cache.Insert(cacheKey, obj, dependencies);
25 }
26 
27 protected void Page_Load(object sender, EventArgs e)
28 {
29     if (!IsPostBack)
30     {
31         string cacheKey = "__test";
32 
33         // 从缓存中获取
34         object obj = GetObjectFromCache(cacheKey);
35         // 缓存里没有
36         if (obj == null)
37         {
38             // 把当前时间进行缓存
39             obj = GetData();
40             if (obj != null)
41             {
42                 // 依赖数据库Temp中的表tbl_Cache的变化来更新缓存
43                 SqlCacheDependency dep = new SqlCacheDependency("TestCache""tbl_Cache");
44                 // 添加到缓存中去
45                 AddObjectToCache(cacheKey, obj, dep);
46             }
47         }
48 
49         GridView1.DataSource = (DataSet)obj;
50         GridView1.DataBind();
51     }
52 }
53 
54 /// <summary>
55 /// 获取数据
56 /// </summary>
57 /// <returns></returns>
58 private DataSet GetData()
59 {
60     string conn = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString();
61     //string sql = "SELECT * FROM tbl_Cache";
62     string sql = "SELECT GETDATE() AS CurrentTime FROM tbl_Cache";
63     SqlConnection myConnection = new SqlConnection(conn);
64     DataSet ds = new DataSet();
65     myConnection.Open();
66     SqlDataAdapter adapter = new SqlDataAdapter(sql, myConnection);
67     adapter.Fill(ds, "tbl_Cache");
68     myConnection.Close();
69     return ds;
70 }
 
      上述代码成功执行之后,就为该表开启的数据库缓存依赖功能,这样只有在数据库该表的数据发生变化时才能是缓存失效,并且重新将新的数据添加到缓存中去,这样直到下一次该表数据发生变化。

      上一篇返回目录 | 下一篇

转载于:https://www.cnblogs.com/jacksonwj/archive/2009/07/10/1520575.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值