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

时间:2011-06-08 15:49:17

标签: c# asp.net sql-server

我将在我运行的网站上为捐款页面做一个进度条。我只希望进度条每天更新一次,而不是像往常一样每次更新页面。

我有什么选项可以获取捐赠的当前SUM并将其放在一个平面文本文件中以供aspx页面读取而不是每次都查询数据库。?

希望这是有道理的。

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

为什么不实施Cache并在24小时内过期?这是一个更好的解决方案,也有助于提高性能: - )

HTH

答案 3 :(得分:1)

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

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

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

  2. 对Windows服务执行相同操作。这对此可能有点过头了。当您需要监听远程连接等服务时,服务很棒,但是为了定期运行任务,内置调度程序工作得很好。

  3. 您生成的文件可能已包含格式化的HTML。您的ASP.NET页面将其包含为用户控件或部分视图。如果您正在使用MVC,则可以使用脚本中的Razor格式化输出。

    同样,我认为这是一个坏主意,并创造了不必要的工作。除非你有充分的理由避免命中数据库,否则不要走这条路。

答案 4 :(得分:0)

如果您希望每天运行一次,那么任务计划程序是您最好的选择。让它运行查询并将结果粘贴到您的网站可以读取的地方。

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

答案 5 :(得分:0)

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

  • 如果您在某个班级中有静态变量,则整个网络应用中都会显示该变量

答案 6 :(得分: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;
        }
    }