诚心请教: Sql2005缓存依赖项 更新无效的问题 三天了 败给它了!

mgzhenhong 2007-08-22 11:12:10
方案设计是这样的
系统运行会产生大约1万个实体类 现需要把这些实体类都存在Cache中
---------------------------------------------------------
环境:
SQL Server 2005 SP2
.Net 2.0
VS2005 Team SP1
---------------------------------------------------------
症状:
1.数据库手动更新后,缓存依赖项不过期,缓存项目依然存在
2.稍作改动后,页面执行完毕,数据库未做任何改动,缓存依赖项自动过期,缓存被清除,且跟踪得到缓存失效原因是 依赖项被更改
---------------------------------------------------------
实现代码及上下文:
---------------------------------------------------------
/// <summary>
/// 根据指定ID返回元素
/// </summary>
/// <param name="intElementId">指定的元素ID</param>
/// <returns>根据ID得到的元素</returns>
public static M_Class getElementById(int intElementId) {
//BaseCacheKey 为 "Class"
//每个实体类都有一个BaseCacheKey
//假设传入的 intElementId = 95 ,则此处CacheKey的值的将例如:"Class95"
//CacheKey将用作实体类的一个实例 存储于Cache中的键名
string CacheKey = BaseCacheKey + intElementId.ToString();

//根据键名取得实体类
M_Class newElement = (M_Class)HttpRuntime.Cache[CacheKey];

//如果Cache中不存在此实体类
if (newElement == null) {
//开始创建此实体类的实例 并读数据库获取相关数据
//实例化
newElement = new M_Class();

//数据操作类实例化
C_Data Data = new C_Data();

//取得Select语句
//返回strSql值为:
// Select Top 1 [CL_ID],[CL_Name],... From [dbo].[TBL_Tec_Class] Where [CL_ID] = 95
string strSql = Data.BuildSingleModelSql("TBL_Tec_Class", "CL_ID", intElementId);

//创建SqlCommand对象
SqlCommand Cmd = new SqlCommand(strSql, Data.Connection);
Data.OpenConnection();

SqlDataReader DR = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

//创建缓存依赖项
SqlCacheDependency SqlDep = new SqlCacheDependency(Cmd);
if (DR.Read()) {
newElement.ID = intElementId;
newElement.Name = DR["CL_Name"].ToString();
newElement.ClassType = new Common.ClassType(Convert.ToInt32(DR["CL_ClassType"]));
newElement.StartTime = Convert.ToDateTime(DR["CL_StartTime"]);
newElement.School = M_School.getElementById(Convert.ToInt32(DR["TS_ID"]));
newElement.Company = M_Company.getElementById(Convert.ToInt32(DR["TC_ID"]));
newElement.Label = DR["CL_Label"].ToString();
newElement.SourcePrice = (float)Convert.ToSingle(DR["CL_SourcePrice"]);
newElement.WebPrice = (float)Convert.ToSingle(DR["CL_WebPrice"]);
newElement.Explain = DR["CL_Explain"].ToString();
}
DR.Close();

//将实体类实例的引用 加入Cache
C_Caches.TryAddCache(CacheKey, newElement, SqlDep);
}
return newElement;
}
-----------------------------------------------
以上代码运行后
会出现症状1所描述的内容

症状2所述的 "稍作改动" 如下:
---------------------------------------------------------
//建立查询Select语句
string strSql = Data.BuildSingleModelSql("TBL_Tec_Class", "CL_ID", intElementId);
//打开数据库连接
Data.OpenConnection();
//创建SqlCommand
SqlCommand Cmd = new SqlCommand(strSql, Data.Connection);
//根据SqlCommand创建缓存依赖项
SqlCacheDependency SqlDep = new SqlCacheDependency(Cmd);
//执行查询
SqlDataReader DR = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
---------------------------------------------------------
功能上并未有任何改动, 只是更改了执行顺序 在创建Cmd后立即创建缓存依赖项(据网上一些资料描述 , 好像会有影响)

执行结果就是如症状2所述


我跟踪了三天 也找遍了百度google和csdn, 依然没有任何头绪
烦请达人给点提示, 到底哪里的问题?
...全文
374 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mgzhenhong 2007-08-30
  • 打赏
  • 举报
回复
长期顶....
mgzhenhong 2007-08-30
  • 打赏
  • 举报
回复
长期顶...
mgzhenhong 2007-08-28
  • 打赏
  • 举报
回复
不需要手动通知 正因为Sql和.Net之间有这样的自动通知通道 所以才用这样
fellowcheng 2007-08-27
  • 打赏
  • 举报
回复
更新数据库后,不用主动通知吗
TigerEatAngil 2007-08-27
  • 打赏
  • 举报
回复
不懂,帮顶
livan1038 2007-08-27
  • 打赏
  • 举报
回复
從頭到尾一看,頭都大了
幫樓主頂,期待牛人
順便學習學習
mgzhenhong 2007-08-27
  • 打赏
  • 举报
回复
再顶顶...
mgzhenhong 2007-08-24
  • 打赏
  • 举报
回复
继续顶一下 又跟踪了N次 还是没答案啊 我很诚心的问啊 !!
mgzhenhong 2007-08-23
  • 打赏
  • 举报
回复
不是吧....还是没有实质回复 继续静候..
堕落陨石 2007-08-23
  • 打赏
  • 举报
回复
顶~~
anison 2007-08-23
  • 打赏
  • 举报
回复
帮楼主顶~~顺便mark~~~没用过2005
whw123456 2007-08-23
  • 打赏
  • 举报
回复
沙发,静候高手~
superhasty 2007-08-23
  • 打赏
  • 举报
回复
建议还是阅读一下ASP.NET的数据缓存依赖相关说明

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧