代码
缓存设计:
SqlCacheDependency类在所有受支持的 SQL Server 版本 (7.0, 2000, 2005) 上监视特定的 SQL Server 数据库表,以便在该表发生更改时,自动从 Cache 中删除与该表关联的项。SqlCacheDependency 类向应用程序的 Cache 添加依赖于 SQL Server 数据库表或 SQL 查询的项.
建立连接对象,再创建一个SqlCommand实例,创建SqlCacheDependency实例,在这步之后再调用Command对象来获取数据(这个顺序很重要)。之后调用Cache的Insert语句建立一个依赖于一个具体查询数据集的Cache项。
Example Code:
public List<Bookmark> GetBookmarkByUserId(string userId, SqlCacheDependency dependency)
{
List<Bookmark> bookmarks = new List<Bookmark>();
string cmdText=string.Format ("select Id,Name,Url,FolderId,Type from dbo.Bookmark where UserId='{0}'",userId);
using (SqlConnection con = new SqlConnection(“connectionString”))
{
con.Open();
SqlCommand cmd = new SqlCommand(cmdText);
dependency = new SqlCacheDependency(cmd);//添加sql缓存依赖 SqlCacheDependency数据库表发生更改时,将自动删除缓存项。
using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
while (dr.Read())
{
Bookmark mark = new Bookmark()
{
Id = dr.GetString(0),
Name = dr.GetString(1),
Url = dr.GetString(2),
Type = dr.GetString(4)
};
bookmarks.Add(mark);
}
}
}
return bookmarks;
}
public List<Bookmark> GetBookamrks(string userId, int timeout)
{
List<Bookmark> bookmarks = new List<Bookmark>();
string key = "userId_" + userId;
bookmarks = (List<Bookmark>)HttpRuntime.Cache[key];
// Check if the data exists in the data cache
if (bookmarks == null)
{
SqlCacheDependency dependency = null;
// If the data is not in the cache then fetch the data from the business logic tier
bookmarks = GetBookmarkByUserId(userId,dependency);
TimeSpan slidingExpiration = TimeSpan.FromHours(timeout);
// Store the output in the data cache, and Add the necessary SqlCacheDependency object
//绝对到期
// HttpRuntime.Cache.Add(key, bookmarks, dependency, DateTime.Now.AddHours(timeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
//滑动过期
CacheItemRemovedCallback callBack = new CacheItemRemovedCallback(onRemove);
HttpRuntime.Cache.Add(key, bookmarks, dependency, Cache.NoAbsoluteExpiration, slidingExpiration, CacheItemPriority.High, callBack);
}
return bookmarks;
}
//移除Bookmark时,同时移除Version
public void onRemove(string key, object val, CacheItemRemovedReason reason)
{
if (HttpRuntime.Cache[key + "version"] != null)
{
HttpRuntime.Cache.Remove(key + "version");
}
}
SqlCacheDependency类在所有受支持的 SQL Server 版本 (7.0, 2000, 2005) 上监视特定的 SQL Server 数据库表,以便在该表发生更改时,自动从 Cache 中删除与该表关联的项。SqlCacheDependency 类向应用程序的 Cache 添加依赖于 SQL Server 数据库表或 SQL 查询的项.
建立连接对象,再创建一个SqlCommand实例,创建SqlCacheDependency实例,在这步之后再调用Command对象来获取数据(这个顺序很重要)。之后调用Cache的Insert语句建立一个依赖于一个具体查询数据集的Cache项。
Example Code:
public List<Bookmark> GetBookmarkByUserId(string userId, SqlCacheDependency dependency)
{
List<Bookmark> bookmarks = new List<Bookmark>();
string cmdText=string.Format ("select Id,Name,Url,FolderId,Type from dbo.Bookmark where UserId='{0}'",userId);
using (SqlConnection con = new SqlConnection(“connectionString”))
{
con.Open();
SqlCommand cmd = new SqlCommand(cmdText);
dependency = new SqlCacheDependency(cmd);//添加sql缓存依赖 SqlCacheDependency数据库表发生更改时,将自动删除缓存项。
using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
while (dr.Read())
{
Bookmark mark = new Bookmark()
{
Id = dr.GetString(0),
Name = dr.GetString(1),
Url = dr.GetString(2),
Type = dr.GetString(4)
};
bookmarks.Add(mark);
}
}
}
return bookmarks;
}
public List<Bookmark> GetBookamrks(string userId, int timeout)
{
List<Bookmark> bookmarks = new List<Bookmark>();
string key = "userId_" + userId;
bookmarks = (List<Bookmark>)HttpRuntime.Cache[key];
// Check if the data exists in the data cache
if (bookmarks == null)
{
SqlCacheDependency dependency = null;
// If the data is not in the cache then fetch the data from the business logic tier
bookmarks = GetBookmarkByUserId(userId,dependency);
TimeSpan slidingExpiration = TimeSpan.FromHours(timeout);
// Store the output in the data cache, and Add the necessary SqlCacheDependency object
//绝对到期
// HttpRuntime.Cache.Add(key, bookmarks, dependency, DateTime.Now.AddHours(timeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
//滑动过期
CacheItemRemovedCallback callBack = new CacheItemRemovedCallback(onRemove);
HttpRuntime.Cache.Add(key, bookmarks, dependency, Cache.NoAbsoluteExpiration, slidingExpiration, CacheItemPriority.High, callBack);
}
return bookmarks;
}
//移除Bookmark时,同时移除Version
public void onRemove(string key, object val, CacheItemRemovedReason reason)
{
if (HttpRuntime.Cache[key + "version"] != null)
{
HttpRuntime.Cache.Remove(key + "version");
}
}