0

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

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

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

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

4

1 回答 1

0

什么问题

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

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

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

当它出现时

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

如何锁定

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

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

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

希望这一切都有帮助。

于 2012-06-11T11:59:31.757 回答