Cache的Insert 和Add 方法引发的血案

将CMS系统部署到阿里云2008服务器后,遇到IIS假死问题,错误日志指向KERNELBASE.dll。排查过程中发现,代码中Cache的Insert方法配合回调事件形成死循环,导致IIS崩溃。在IIS 6(Win2003 Server)上未出现此问题,而在IIS 7及7.5(.Net 2.0)上出现。解决方案是避免多次调用Insert或在插入前检查Cache是否为空,或者使用Add方法代替。

Cache的Insert 和Add 方法引发的血案

把一个简单的CMS系统拷贝到阿里云2008服务器上后,执行一个页面操作的时候,第一次操作正常,第二次或者第三次的时候,IIS就假死。查看日志:“**错误应用程序名称: w3wp.exe,版本: 7.5.7601.17514,时间戳: 0x4ce7a5f8
错误模块名称: KERNELBASE.dll,版本: 6.1.7601.19045,时间戳: 0x56258f05**”“错误存储段 ,类型 0 事件名称: APPCRASH 响应: 不可用”。

百度了一下,各种说法都有,有说权限不够的,有说程序有错误的。于是各种权限实验,还是报同样的错误。注意到其中有一条是说,程序里面有死循环所以导致溢出。联想到程序在2003下跑得欢快,而且每次都是点特定的页面第二三次,iis才crash。

开始测试数据库是否正常。自己写了和crash页面相同功能的操作,实验多次,发现不是数据库问题。那么应该是代码问题了。不过没有源码啊没有源码。没有办法只有反对编译,使用ILSpy 反编译代码。

看源代码好像没有什么问题啊,很简单,就是获取参数,然后塞入数据库。

没法子,把源代码拷贝出来,直接放在aspx运行,还是crash,把怀疑的注释掉,终于在我注释掉一个

Lib.Second.Tags.AddTagListToCache(this.siteId);

后IIS的日志里面再也没有crash了。再反编译这个方法其实是调用了一个Cache类,再反编译:

“`
public class NewsCache
{
private static object syncObj;
protected int _timeOut = 6000;
protected static volatile Cache webCache;
public int TimeOut
{
get
{
return (this._timeOut >

<think>好的,我现在需要回答用户关于C#中cache.Insert的问题。首先,用户问的是“cache.Insert”,但C#中有不同的缓存实现,比如System.Web.Caching.Cache或者MemoryCache。我需要确定最常见的场景,可能是ASP.NET中的Cache类。 首先,我应该解释cache.Insert方法的作用,它是用来向缓存中添加项,并可以覆盖现有项。然后需要说明参数,比如键、值、依赖项、绝对过期时间、滑动过期时间、优先级回调函数。需要给出一个示例代码,展示如何使用这些参数。 接下来,要解释每个参数的意义,比如CacheDependency可能是什么,绝对过期滑动过期的区别,优先级的作用,以及回调函数的用途,比如在缓存项被移除时触发。 然后,用户可能想了解为什么使用Insert而不是Add,可能是因为Insert会覆盖已有项,而Add会失败如果键已存在。这也是需要提到的区别。 最后,相关问题应该围绕缓存的其他方法、过期策略、依赖项缓存回调等,确保覆盖用户可能进一步的问题。</think><< 在C#中,`cache.Insert` 是用于向缓存中添加或替换缓存项的方法,常见于`System.Web.Caching.Cache`或`System.Runtime.Caching.MemoryCache`。以下是其典型用法: ```csharp // 使用System.Web.Caching.Cache的示例 Cache cache = HttpRuntime.Cache; // 插入缓存项(覆盖已存在的键) cache.Insert( "MyCacheKey", // 缓存键 "CachedValue", // 缓存值 null, // 依赖项(如文件或数据库依赖) DateTime.Now.AddMinutes(30), // 绝对过期时间(UTC时间) System.Web.Caching.Cache.NoSlidingExpiration, // 滑动过期时间 System.Web.Caching.CacheItemPriority.Default, // 缓存优先级 OnCacheItemRemoved // 缓存移除回调 ); // 回调方法 private static void OnCacheItemRemoved(string key, object value, CacheItemRemovedReason reason) { // 处理缓存项被移除的逻辑 } ``` **参数说明**: 1. **Key**:缓存项的唯一标识符 2. **Value**:要缓存的对象 3. **Dependencies**:缓存依赖(如文件、数据库或其他缓存键) 4. **AbsoluteExpiration**:固定过期时间(超过该时间强制失效) 5. **SlidingExpiration**:滑动过期时间(最后一次访问后多久失效) 6. **Priority**:缓存项的优先级(影响内存不足时的移除顺序) 7. **Callback**:缓存项被移除时的回调方法 **与`Add`方法的区别**: - `Insert`会覆盖已存在的相同键的缓存项 - `Add`方法如果键已存在则会返回`null`且不覆盖
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值