2011-06-08 73 views
5

我将在我运行的网站上为捐款页做一个进度条。我只希望进度条每天更新一次,而不是像通常那样每次进行页面加载。c#/ ASP.NET/SQL Server - 每天运行一次查询

我有什么选择来抓取当前的捐款总额,并将其放在一个扁平的文本文件中,以供aspx页面读取,而不是每次查询数据库。

希望这是有道理的。

回答

3

另一种选择是使用缓存并将缓存设置为每24小时仅过期一次。然后将数据拉出并放入缓存中,并且缓存的版本全天提供。

1

我只是每次在数据库上运行SUM查询。除非你预计每天会有数百万行插入,否则这将是一次可忽略的性能下降。 (提供您的数据库表的索引)

+0

的一点是,他们不希望值来更新不断更新。他们只想每天更新一次值。 – 2011-06-08 15:55:01

+1

然后修改你的查询,只在给定的日期时间之前包括交易:) – DaveRead 2011-06-08 15:56:05

+0

是的 - 如果他在相关表格中包含创建日期列(以及为什么你不会 - 我的所有表都有),这是微不足道的。 – 2011-06-08 15:57:57

0

如果您想每天运行一次,Task Scheduler是您最好的选择。让它运行查询并将结果粘贴到您的网站可以读取的某处。

下一个选项是使用缓存。让代码检查值是否在缓存中。如果是,请使用它。如果不是,请运行查询并填充缓存。将缓存设置为24小时后过期。问题在于,查询可能会在一个繁忙的网站上运行多次(在缓存过期之后但在第一次请求再次填充之前有多个请求进入),但是对于查询而言可能并不重要花很长时间。

1

为什么不实施Cache并使其在24小时内过期?这是一个更好的解决方案,并且有助于表现太:-)

HTH

1

第一:这种类型的查询是非常快的;除非你有一些你没有提到的理由,否则只要每次加载时都让页面查询数据库。现在很多人似乎都主张避免往返数据库。但是,SQL Server很快就会,而这种事情对你的应用程序性能几乎没有影响。此外,我很乐意尽可能地显示准确的数据,而不是可能24小时过时的数据。

如果你坚持这样做,你有几个选择。

  1. 创建VBScript或(首选)PowerShell脚本查询数据库和转储结果,比方说,在连接到你的网站上的虚拟文件夹的ASPX,ASCX或HTML文件。将脚本设置为在您的Web服务器上(或脚本服务器,如果有的话)作为计划任务运行。

  2. 对Windows服务做同样的事情。这可能是矫枉过正的。当你需要一些东西来监听远程连接等时,服​​务是非常棒的,但是为了定期运行一个任务,内置的调度器工作得很好。

您生成的文件应该可能已经包含格式化的HTML。您的ASP.NET页面将包含此用户控件或部分视图。如果您使用的是MVC,则可以使用脚本中的Razor来格式化输出。

再次,我认为这是一个坏主意,并且创造不必要的工作。除非你避免碰到数据库有一个很好的理由,否则不要走这条道路。

0
  • 尝试搜索ASP.NET全局缓存示例。设置两个变量,一个用于查询结果,另一个用于查询执行的DateTime。检查代码是否DateTime.Now - 在高速缓存中的日期为> 24小时 - >再次更新(或类似的东西)

  • 如果你有一些类的静态变量,它是在整个Web应用程序可见

0

我会说要使用缓存。作为对其他缓存答案的改进,您可以使用一些代码来实现缓存,使缓存每天在同一时间过期,而不是在第一次访问后的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; 
     } 
    }