.NET对缓存项的引用(DataTable)

时间:2011-10-06 10:42:15

标签: .net caching

在处理我正在缓存中存储的DataTable时,我看到了似乎奇怪的行为。虽然它可能是设计的。

情景很简单。我将数据库查询的结果存储在DataTable中并将其放入该缓存中。在执行数据库查询或从缓存中获取结果后,我需要对其进行一些后期操作(例如添加列或排序)。似乎操作正在缓存中的项目上发生。所以当我从缓存中获取项目时,它必须抓住对它的引用?

代码

string CacheKey = "SearchData";
DataTable CachedResults = null;
object CachedObject = Cache[CacheKey];
if (CachedObject is DataTable) { CachedResults = (DataTable)CachedObject; }
if (CachedResults == null)
{
  CachedResults = new DataTable();
  // Query the database and fill CachedResults

  if (Cache[CacheKey] == null)
  {
    Cache.Add(CacheKey, CachedResults, null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration, CacheItemPriority.Low, null);
  }

}

CachedResults.Columns.Add("NewColumn");

我想我的问题是,CachedResults只是对缓存项的引用吗?如果我想避免这种情况,我需要在DataTable上复制一份?

非常感谢, Maleks

2 个答案:

答案 0 :(得分:2)

这实际上取决于底层缓存提供程序是什么。如果它是内存中的提供者,那么是:您正在操作对对象的单个引用。这可能非常糟糕,因为DataTable不是线程安全的 - 而且你会混淆使用它的其他代码。

但是,如果您使用sql-server之类的东西作为缓存的后端,它将序列化和反序列化。

就个人而言,我的建议是:只缓存不可变数据,或者,如果必须缓存可变数据,不要改变它从缓存中获取它时。

在您的具体情况中,是的:在获取后复制DataTable可以避免此问题。

答案 1 :(得分:1)

是的,它是对缓存项的引用。我一直管理它的方法是在从缓存中检索它时立即复制,这样就不会自动反映更改。