我有哪些选择来获取当前捐赠总额,并将其放入一个纯文本文件中,以供aspx页面读取,而不是每次查询数据库?
希望这样说得清楚。
另一种选择是使用缓存,并将缓存设置为每 24 小时仅过期一次。然后,数据被提取并放置在缓存中,整天都返回缓存版本。
首先,这种类型的查询非常快;除非您有一些未提及的原因,否则每次加载页面时都让页面查询数据库即可。现在很多人似乎主张避免与数据库进行往返交互。然而,SQL Server非常快,这种操作对应用程序性能几乎没有影响。此外,我喜欢尽可能显示准确的数据 - 而不是潜在的24小时过时的数据。
如果您坚持要这样做,您有几个选择。
创建一个VBScript或(首选)PowerShell脚本,查询数据库并将结果转储到附加到您的网站的虚拟文件夹中的aspx、ascx或HTML文件中。将脚本设置为在Web服务器上运行的计划任务(或者如果您有一个脚本服务器,则在脚本服务器上运行)。
使用Windows服务执行相同的操作。这可能有点过度了。当您需要监听远程连接等内容时,服务非常好用,但是对于定期运行任务,内置的计划程序完全可以胜任。
你生成的文件应该已经包含格式化的HTML。你的ASP.NET页面将包括此作为用户控件或部分视图。如果你正在使用MVC,你可以使用Razor从你的脚本来格式化输出。
再次强调,我认为这是一个不好的想法,并且会创建不必要的工作。除非你有一个非常好的理由避免访问数据库,否则不要走这条路。
如果你想让某些东西每天只运行一次,任务计划程序是最好的选择。让它运行一个查询并将结果存储在网站可以读取的地方。
下一个选项是使用缓存。让你的代码检查值是否在缓存中。如果是,则使用该值。如果不是,则运行查询并填充缓存。将缓存设置为24小时后过期。这种方法的问题是,在繁忙的网站上,查询可能会运行多次(在缓存过期之后但第一个请求再次填充之前有多个请求进来),但对于不需要很长时间的查询,这可能并不重要。
尝试搜索ASP.NET全局缓存示例。设置两个变量,一个用于查询结果,另一个用于查询执行的DateTime。在代码中检查DateTime.Now - 缓存中的日期是否> 24h ->再次更新(或类似操作)
如果您在某个类中有静态变量,则该变量在整个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;
}
}