缓存项目损坏或混淆

时间:2012-06-11 11:12:24

标签: asp.net caching

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

有时候我们会遇到一个周期性的错误,看起来有些缓存项已经混淆了。 如何显示这一点的一个示例是当一段代码从缓存中提取DataTable然后尝试访问该DataTable的某个列时。 然后我们看到一个黄色的死亡屏幕,除了“找不到列[ColumnName]”,其中“ColumnName”当然是一些应该在DataTable中的列名。 当我用一个小的自制工具检查缓存项时,我看到缓存项中有一个完全不同的DataTable。这几乎就像是一些缓存项目混淆了。

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

我们无法重现错误。它以明显随机的间隔发生。

1 个答案:

答案 0 :(得分:0)

问题是什么

将项目添加到缓存时,需要锁定创建它们的进程并将其添加到缓存中。

首先让澄清缓存是否保留对数据的引用,不克隆它们,nether知道什么不是那些数据!参考:http://msdn.microsoft.com/en-us/library/6hbbsfk6(VS.71).aspx

第二个澄清页面的默认会话是锁定页面,并且通过使大多数请求安全,因为所有用户都会锁定,直到页面完全加载并发送。

出现时

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

如何锁定

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

如果您以后更改数据并且仍然存在于缓存中,则需要锁定制作数据的完整过程,如果您克隆它们,则需要锁定缓存引用。

例如,如果您读取了从缓存中获取的某些数据,那么您编辑它们的时间,如果其他一些数据读取相同的缓存,则会获得损坏的数据,因为缓存会为您提供对它们的引用。

希望这一切都有所帮助。