C# / ASP.NET / SQL Server - 每天运行一次查询

6
我要在网站上的捐赠页面上添加进度条。我希望每天只更新一次进度条,而不是像通常那样在每个页面加载时都更新。
我有哪些选择来获取当前捐赠总额,并将其放入一个纯文本文件中,以供aspx页面读取,而不是每次查询数据库?
希望这样说得清楚。
7个回答

4

另一种选择是使用缓存,并将缓存设置为每 24 小时仅过期一次。然后,数据被提取并放置在缓存中,整天都返回缓存版本。


2
为什么不实施缓存,并使其在24小时后过期?这是更好的解决方案,也有助于性能:-)
希望对你有帮助。

1
我会每次在数据库上运行一个SUM查询。除非你每天都期望插入数百万行,否则这对性能的影响将是可以忽略不计的。(前提是你的数据库表已经建立索引)

重点是他们不希望该值被不断更新。他们只想每天更新一次该值。 - Ash Burlaczenko
1
然后修改您的查询,仅包括在给定日期时间之前的交易 :) - DaveRead
是的 - 如果他在相关表中包含了创建日期列(为什么不呢 - 我的所有表格都有那个),这很简单。 - 3Dave

1

首先,这种类型的查询非常快;除非您有一些未提及的原因,否则每次加载页面时都让页面查询数据库即可。现在很多人似乎主张避免与数据库进行往返交互。然而,SQL Server非常快,这种操作对应用程序性能几乎没有影响。此外,我喜欢尽可能显示准确的数据 - 而不是潜在的24小时过时的数据。

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

  1. 创建一个VBScript或(首选)PowerShell脚本,查询数据库并将结果转储到附加到您的网站的虚拟文件夹中的aspx、ascx或HTML文件中。将脚本设置为在Web服务器上运行的计划任务(或者如果您有一个脚本服务器,则在脚本服务器上运行)。

  2. 使用Windows服务执行相同的操作。这可能有点过度了。当您需要监听远程连接等内容时,服务非常好用,但是对于定期运行任务,内置的计划程序完全可以胜任。

你生成的文件应该已经包含格式化的HTML。你的ASP.NET页面将包括此作为用户控件或部分视图。如果你正在使用MVC,你可以使用Razor从你的脚本来格式化输出。

再次强调,我认为这是一个不好的想法,并且会创建不必要的工作。除非你有一个非常好的理由避免访问数据库,否则不要走这条路。


0

如果你想让某些东西每天只运行一次,任务计划程序是最好的选择。让它运行一个查询并将结果存储在网站可以读取的地方。

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


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

  • 如果您在某个类中有静态变量,则该变量在整个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;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接