在数据量比较大并发多的时候一定要注意缓存的更新方式,否则会造成数据拥堵导致服务器没有响应。

发生问题时的代码:

public DataTable GetData()
{
DataTable dtResault = new DataTable(); if (HttpRuntime.Cache[strCacheName] == null) { dtResault = GetDT();//获取数据 HttpRuntime.Cache.Add(strCacheName,dtResault ..); } else { dtResault = HttpRuntime.Cache[strCacheName] as DataTable; } return dtResault ;
}

上面代码的问题在于在并发量高的时候,各个线程都会去获取数据并Add到缓存中。而Add则是类似static readonly并且不覆盖之前的同一个Key的缓存,这样就会产生问题。在GetDT()的过程中会有多个线程执行到这一步,有多少个并发就会连多少次数据库

并且添加缓存。最终导致服务器反应超级迟缓。

修改后:

public DataTable GetData()
{
DataTable dtResault = new DataTable(); 
lock(objLock)
{
if (HttpRuntime.Cache[strCacheName] == null)
{
    dtResault = GetDT();//获取数据 
    HttpRuntime.Cache.Insert(strCacheName,dtResault ..);
}
else
{
    dtResault = HttpRuntime.Cache[strCacheName] as DataTable;
}
}
return dtResault ;
}

加锁,用Insert方法。Insert类似于statice,会覆盖之前相同key的缓存。