上一篇 | 返回目录 | 下一篇
对于普通文件的读取,上一篇的缓存已经足够了,但是平时更多的是和数据库进行交互,所以,本篇的这个缓存相对来说,要重要一些。数据库依赖缓存在.NET平台下面有很好的解决方案:SQLCacheDependency,相对于上面的文件缓存来说,这个实现要稍微复杂一点,代码如下(我使用的是Temp数据库,内建表:tbl_Cache,字段任意,并且任意添加了一行数据):
首先修改web.config,添加连接字符串,并且在system.web中配置使其支持数据库缓存依赖。
数据库连接字符串
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>
在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”的表,该表记录的就是您需要监视的数据库的变动情况。
对于该工具,后面的参数详细的解释如下所示:
aspnet_regsql.exe 参数解释
1 要使得7.0或者2000版本以上的SQLServer支持SqlCacheDependency特性,需要对数据库服务器执行相关的配置。
2
3 有两种方法配置SQLServer:
4
5 一 使用aspnet_regsql命令行工具。
6 二 使用SqlCacheDependencyAdmin类。
7
8 例如:
9
10 aspnet_regsql -S "server" -E -d "database" –ed 或者
11 aspnet_regsql -S "server" -E -d "database" -et -t "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功能。
接下来就开始编码,在代码中使用缓存。
在代码中使用数据库缓存依赖
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 }
上述代码成功执行之后,就为该表开启的数据库缓存依赖功能,这样只有在数据库该表的数据发生变化时才能是缓存失效,并且重新将新的数据添加到缓存中去,这样直到下一次该表数据发生变化。
上一篇 | 返回目录 | 下一篇