日期:2014-05-20  浏览次数:20437 次

缓存碰到的问题,有代码
///   <summary>
///   根据forumid获取特定版块的信息
///   </summary>
///   <param   name= "forumid "> 版块ID </param>
///   <returns> 返回一个数据行 </returns>
public   static   DataRow   GetForumInfo(string   forumid)
{

DataRow   dr   =   null;
Hashtable   myht   =   (Hashtable)HttpContext.Current.Application[ "dh_strdrhd "];
if(myht==null)
{
myht   =   new   Hashtable();
DataTable   dt   =   GetForumHead()   ;
for(int   i=0;i <dt.Rows.Count;i++)
{
dr   =   dt.Rows[i];
if(false==myht.Contains(Convert.ToString(dr[ "forumid "])))
{
myht.Add(Convert.ToString(dt.Rows[i][0]),dr);
}

}
HttpContext.Current.Application[ "dh_strdrhd "]   =   myht;
bbs.Common.Util.WriteTxt( "根据forumid获取特定版块的信息 ");
}
dr   =   (DataRow)myht[forumid];
return   dr;
}


我想把一些信息缓存,可是,发现1分钟后就超时了,这是怎么回事呢

------解决方案--------------------
放在Application中是没有超时的概念的, 是不是你重新编译的问题?
------解决方案--------------------
编译过application中的信息肯定不会存在了.
------解决方案--------------------
如果不重新生成,每隔一分钟也是如此?
------解决方案--------------------
请确认是不是因为编译引起的问题,如果是,就不用解决,这是正常的.
------解决方案--------------------
重新生成项目相应于重启应用程序,所有 内存中的信息会丢失.这是正常的. 因为运行的时候不会出现这种情况. 所以我让你确定是不是编译引起的,
------解决方案--------------------
如果不编译,过几分钟再看,数据还在不在.
------解决方案--------------------
在项目中搜索一下 Application[ "dh_strdrhd "] 看看,是不是其他的地方将它释放了.
------解决方案--------------------
与静态函数应该没有关系。 为什么是每隔一分钟?时间准确?那肯定就是人为的原因。
------解决方案--------------------
呵呵,你自己买一台服务器,确保资源非常充足,那么几十分钟才会调用一次。

即使资源非常充足,应用程序也会有一些机会(当它被服务认为需要维护的时候)被重新启动,例如iis默认地就会定时重新启动子程序。说application中能在整个(传统意义上的)应用程序生命期保存,是个及其不严谨的说法。

web服务最初本来就是如此设计的。当可以在浏览器上访问一个页面的时候,也许提交前web服务已经重新启动了,甚至物理机器已经断电然后重新启动了,但是传统的web页面并不在乎这个,因为它的通讯和内容设计是服务端无状态的设计。iis、asp.net中许多地方都是为了提高Web服务的可靠性和吞吐率而设计的,而不是按照传统的c/s软件那样认为设计的。

如果你想避免它,配置你的web服务器,选择更好的服务器硬件,或者干脆自己写一个web服务程序(用.net写web服务器其实还是比较容易的,web服务不过是asp.net这座大厦楼下门前的一个比较粗俗的邮递员)。
------解决方案--------------------
哦,我说的“web服务”不是指webService,使指 httpServer 产品。有很多个人产品可以运行asp.net的。