Asp.net 缓存项已损坏或混淆

Asp.net 缓存项已损坏或混淆,asp.net,caching,Asp.net,Caching,我对一个缓存了几个对象的网站有一个非常奇怪的问题。 我们有很多数据表、字符串、布尔值和其他缓存的东西,以便在以后的请求中快速获取 有时我们会遇到周期性错误,其中一些缓存项似乎被混淆了。 当一段代码从缓存中获取一个数据表,然后尝试访问该数据表的某一列时,就会显示出这种情况。 然后,我们看到一个死亡的黄色屏幕,例外是“找不到列[ColumnName]”,其中“ColumnName”当然是应该在DataTable中的某个列名。 当我用自制的工具检查缓存项时,我看到缓存项中有一个完全不同的DataTab

我对一个缓存了几个对象的网站有一个非常奇怪的问题。 我们有很多数据表、字符串、布尔值和其他缓存的东西,以便在以后的请求中快速获取

有时我们会遇到周期性错误,其中一些缓存项似乎被混淆了。 当一段代码从缓存中获取一个数据表,然后尝试访问该数据表的某一列时,就会显示出这种情况。 然后,我们看到一个死亡的黄色屏幕,例外是“找不到列[ColumnName]”,其中“ColumnName”当然是应该在DataTable中的某个列名。 当我用自制的工具检查缓存项时,我看到缓存项中有一个完全不同的DataTable。这几乎就像一些缓存项被混淆了一样

有人知道这是怎么发生的吗

我们无法重现错误。这显然是随机发生的。

有什么问题 将项目添加到缓存时,需要锁定创建项目并添加到缓存的过程

首先让我们澄清一下,缓存是保留对您的数据的引用,而不是克隆它们,否则就知道什么不是数据!参考:

其次,澄清页面的默认会话是锁定页面,并确保大部分请求的安全,因为所有用户都会锁定页面,直到页面完全加载并发送

当它出现时 因此,当您试图通过线程、处理程序或关闭会话的页面进行缓存时,可能会出现锁定问题

如何锁定 如果只使用一个池,那么简单的
lock(object){}
可以工作,如果使用多个池,则需要使用
mutex()
进行锁定

如果以后更改了数据并且数据仍然存在于缓存中,则需要锁定生成数据的整个过程;如果克隆了数据,则仅锁定缓存引用

例如,如果您读取了从缓存中获取的一些数据,那么在编辑这些数据时,如果其他人读取了相同的缓存,则将获取损坏的数据,因为缓存为您提供了对这些数据的引用


希望所有这些都能有所帮助。

在ASP.NET(framework 3.5)IIS 6.0中,由于无法复制的随机问题,我放弃了缓存,使用了静态集合或会话。当我们升级到IIS 7和.NET 4时,我可能会再次尝试使用它。看来您的锁不好,而且您的缓存可由不同的线程访问。您是否使用任何类型的锁?当您创建或访问缓存时?我不使用锁。无论是在写入缓存还是从缓存中获取数据时。@EmKay这就是错误所在……问题在于应用程序中的多个位置使用了不稳定的数据库连接,因此问题根本不是缓存。然而,这个答案让我对缓存的最佳实践更加明智,因此代码现在更加稳定。谢谢:)