【发布时间】:2011-02-08 04:23:37
【问题描述】:
我有一个 ASP.NET MVC 3 / .NET Web 应用程序,它大量由数据驱动,主要围绕“位置”的概念(纽约、加利福尼亚等)。 p>
无论如何,我们有一些非常繁忙的数据库查询,它们在完成后会被缓存。
例如:
public ICollection<Location> FindXForX(string x)
{
var result = _cache.Get(x.ToKey()) as Locaiton; // try cache
if (result == null) {
result = _repo.Get(x.ToKey()); // call db
_cache.Add(x.ToKey(), result); // add to cache
}
return result;
}
但我不想让倒霉的第一个用户等待这个数据库调用。
数据库调用可能需要 40-60 秒,远远超过 ASP.NET 请求的默认超时时间。
我想在我的应用启动时或之后不久为某些“热门”位置(例如纽约、加利福尼亚)“预热”这些呼叫。
我不想简单地在 Global asax (Application_Start) 中执行此操作,因为启动应用程序需要很长时间。 (我计划预先缓存大约 15 个位置,因此只需几分钟的工作时间)。
有什么方法可以异步触发这个逻辑?也许旁边的服务是更好的选择?
我能想到的唯一其他选择是有一个管理页面,其中包含用于这些操作的按钮。因此,一旦应用程序启动,管理员(例如我)就可以触发这些查询。这将是最简单的解决方案。
有什么建议吗?
【问题讨论】:
-
“数据库调用可能需要 40-60 秒” - 我假设您有适当的索引?
-
是的,这似乎是一个很长的查询。您应该尝试提高效率——甚至可以摆脱这个预热问题! :)
-
@Mitch 什么 - 是的,我们有索引。这是我能做到的最快的。如果我们有一个查询“查找纽约的所有位置”,它需要查找所有城市、社区、街道。可能是 500 万条记录。一个错误的查询可以节省 500 万个其他查询,这些查询现在由于缓存而变得多余。值得,相信我 - 有一种疯狂的方法。 :)
-
"我能做到的一样快" - 你确定吗?多少逻辑读?
-
@RPM1984:旁注,真棒 gravatar!
标签: asp.net asp.net-mvc caching .net-4.0 asp.net-mvc-3