asp.net - 对数据库的访问进行队列以避免多个缓存项

标签 asp.net multithreading sql-server-2008

我有一个与音乐相关的 ASP.NET 网站,它在第一次请求时缓存数据库中的大量静态信息。

有时,当应用程序负载较重时,应用程序会被重置并清除缓存,然后所有 http 请求都会转到数据库以检索静态数据并将其缓存以供其他请求使用。

如何确保只有一个请求访问数据库并缓存结果,以便其他请求只需从缓存中读取该信息,而不必一遍又一遍地检索相同的信息。

我可以使用线程锁定吗?例如,我可以执行类似 lock(this) { db access here } 的操作吗?

最佳答案

是的,在缓存代码中,您需要将数据库访问代码放入 lock block 中。但是,不要锁定。通常你会做类似的事情

private static readonly object staticObjectToLockOn = new object();

...

if (cache[cacheKey] == null)
{
   lock(staticObjectToLockOn)
   {
      // double-check the cache is still null inside the lock
      if (cache[cacheKey] == null)
      {
         // get data from the database, add to cache
      }
   }
}

关于asp.net - 对数据库的访问进行队列以避免多个缓存项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2989520/

相关文章:

ios - NSCondition,如果调用信号时没有锁定怎么办?

java线程在创建外部对象之前访问它

c# - 如何设置文本框的最大长度限制?

c# - 如何撤消 Response.Cache.SetNoStore()?

java - 在多个主机上并行执行

sql - 使用 IF NOT EXISTS 生成插入脚本

sql - 按日期范围消除行

c# - 创建后删除文件

asp.net - SSRS : Why do SKA-cookies build up until "HTTP 400 Bad Request - Request Too Long" occurs?

sql - 仅转换 SQL Server 中日期时间的年份部分