我将在我运行的网站上为捐款页做一个进度条。我只希望进度条每天更新一次,而不是像通常那样每次进行页面加载。c#/ ASP.NET/SQL Server - 每天运行一次查询
我有什么选择来抓取当前的捐款总额,并将其放在一个扁平的文本文件中,以供aspx页面读取,而不是每次查询数据库。
希望这是有道理的。
我将在我运行的网站上为捐款页做一个进度条。我只希望进度条每天更新一次,而不是像通常那样每次进行页面加载。c#/ ASP.NET/SQL Server - 每天运行一次查询
我有什么选择来抓取当前的捐款总额,并将其放在一个扁平的文本文件中,以供aspx页面读取,而不是每次查询数据库。
希望这是有道理的。
另一种选择是使用缓存并将缓存设置为每24小时仅过期一次。然后将数据拉出并放入缓存中,并且缓存的版本全天提供。
我只是每次在数据库上运行SUM查询。除非你预计每天会有数百万行插入,否则这将是一次可忽略的性能下降。 (提供您的数据库表的索引)
如果您想每天运行一次,Task Scheduler是您最好的选择。让它运行查询并将结果粘贴到您的网站可以读取的某处。
下一个选项是使用缓存。让代码检查值是否在缓存中。如果是,请使用它。如果不是,请运行查询并填充缓存。将缓存设置为24小时后过期。问题在于,查询可能会在一个繁忙的网站上运行多次(在缓存过期之后但在第一次请求再次填充之前有多个请求进入),但是对于查询而言可能并不重要花很长时间。
为什么不实施Cache并使其在24小时内过期?这是一个更好的解决方案,并且有助于表现太:-)
HTH
第一:这种类型的查询是非常快的;除非你有一些你没有提到的理由,否则只要每次加载时都让页面查询数据库。现在很多人似乎都主张避免往返数据库。但是,SQL Server很快就会,而这种事情对你的应用程序性能几乎没有影响。此外,我很乐意尽可能地显示准确的数据,而不是可能24小时过时的数据。
如果你坚持这样做,你有几个选择。
创建VBScript或(首选)PowerShell脚本查询数据库和转储结果,比方说,在连接到你的网站上的虚拟文件夹的ASPX,ASCX或HTML文件。将脚本设置为在您的Web服务器上(或脚本服务器,如果有的话)作为计划任务运行。
对Windows服务做同样的事情。这可能是矫枉过正的。当你需要一些东西来监听远程连接等时,服务是非常棒的,但是为了定期运行一个任务,内置的调度器工作得很好。
您生成的文件应该可能已经包含格式化的HTML。您的ASP.NET页面将包含此用户控件或部分视图。如果您使用的是MVC,则可以使用脚本中的Razor来格式化输出。
再次,我认为这是一个坏主意,并且创造不必要的工作。除非你避免碰到数据库有一个很好的理由,否则不要走这条道路。
尝试搜索ASP.NET全局缓存示例。设置两个变量,一个用于查询结果,另一个用于查询执行的DateTime。检查代码是否DateTime.Now - 在高速缓存中的日期为> 24小时 - >再次更新(或类似的东西)
如果你有一些类的静态变量,它是在整个Web应用程序可见
我会说要使用缓存。作为对其他缓存答案的改进,您可以使用一些代码来实现缓存,使缓存每天在同一时间过期,而不是在第一次访问后的24小时后过期。这可以防止在流量不稳定的情况下出现不稳定的更新时间。中断后的第一个请求将查找该值,并将其持续到下一个截止时间。但是无论第一次请求发生在何时,截止保持不变。
沿着这个东西线:
int ProgressValue
{
get
{
int? Value = Cache["ProgressValue"] as int?;
if (Value == null)
{
//Set expiration time to 6 AM tomorrow.
DateTime ExpTime = DateTime.Now.Date.AddDays(1).AddHours(6);
Value = GetValueFromDB();
Cache.Insert("ProgressValue", Value, null, ExpTime, System.Web.Caching.Cache.NoSlidingExpiration);
}
return (int)Value;
}
}
的一点是,他们不希望值来更新不断更新。他们只想每天更新一次值。 – 2011-06-08 15:55:01
然后修改你的查询,只在给定的日期时间之前包括交易:) – DaveRead 2011-06-08 15:56:05
是的 - 如果他在相关表格中包含创建日期列(以及为什么你不会 - 我的所有表都有),这是微不足道的。 – 2011-06-08 15:57:57