缓存中数据交叉使用引起的问题
时间:2010-12-13 来源:cai919
某次修改代码后测试时前端一直在加载状态,也没有异常抛出,第一反应是死循环.经过逐步调试发现问题:取交叉数据的地方出了问题,用户瓶子列表的时候要显示某个瓶子的最新动态,动态记录一样也对应一个缓存对象并且动态里面也需要显示产生该动态的瓶子名称.根据实际情况,现在的做法是将所需数据级联查询出来作为一个整体缓存,减轻缓存服务器负担和查询交叉数据时的死循环.
在调试的时候还发现另外一个问题:在并发查询某缓存外数据时,由于前面一次的过程尚未执行完成,数据还没有写入到缓存中,接下来再次请求相同的数据一样是从数据库实时查询的.加一个排它锁即可保证只从数据库中取一次.
lock (lock_BottleInfo) { BottleInfo model = MCGenericHelper.getValueFromMC<BottleInfo>(ref MCGenericHelper.mc_forever, CacheKeyHelper.BottleKey.BOTTLE_INFO + bottleID); if (null == model || (null != model && model.StyleID == 2 && model.IsDrift == 0)) { DbCommand dbc = m_DbRead.GetStoredProcCommand("Bottle_SelectOne"); m_DbRead.AddInParameter(dbc, "@pBottleID", DbType.Int32, bottleID); using (IDataReader reader = m_DbRead.ExecuteReader(dbc)) { if (reader.Read()) { //... MCGenericHelper.MCStore<BottleInfo>(ref MCGenericHelper.mc_forever, ref model, CacheKeyHelper.BottleKey.BOTTLE_INFO + bottleID); } } } return model; }
相关阅读 更多 +