如何每天重置应用程序变量

Posted

技术标签:

【中文标题】如何每天重置应用程序变量【英文标题】:How to reset an application variable daily 【发布时间】:2013-02-21 05:21:38 【问题描述】:

我正在编写一个记录服务调用和处理完成的程序。我们有许多用户打开和关闭呼叫,我想始终显示今天打开的呼叫总数和今天关闭的总数以及它们之间的差异。我想用一个应用程序变量来做。我必须每天将这些变量重置为 0。我会在哪里做呢?我在 Global.asax 中想过,但在哪种情况下可以这样做?该应用程序一直在运行,所以我认为 Application_Start 不合适。那么在哪里呢?谢谢。

【问题讨论】:

懒惰的方法:a) 保存最后一次通话的时间 b) 在每次通话时检查日期是否更改并在必要时刷新计数器。 您在哪里记录服务呼叫?如果您将它们存储在数据库中,那么您只需要一个查询... 这样的需求肯定应该存储在数据库中吗?只要您使用日期标志保留呼叫/治疗,您就可以查询您想要的信息。这不是真正适合应用程序变量的信息。 使用应用程序变量可能会产生不一致的结果,因为这些结果会在应用程序池重新启动时重置,这可能会在资源不足等情况下发生(不可预测)。我的建议是将每个呼叫及其日期/时间存储在数据库中,并将已关闭呼叫与日期时间存储在数据库中,然后在日期上使用 GROUP BY 子句并在 SELECT 语句中使用 COUNT 函数来获取您需要的数字。 @bUKaneer 感谢您提供有关产生不一致结果的应用程序变量的信息。 【参考方案1】:

我有一个日期变量,其中包含上次重置计数器的时间,并在每次访问计数器时检查日期是否为“今天”。

除非你有严重的性能问题,否则我想这就是要走的路。

在更新计数器时调用的示例easy-lazy代码:

lock(myCounter)
 
  if(DateTime.Now.Date != lastDateCounterWasReset)
  
     lastDateCounterWasReset = DateTime.Now.Date;
     myCounter = 0;
  
  myCounter++;

现在我们需要更多地了解您希望如何存储这些变量(myCounterlastDateCounterWasReset),但基本上可以在任何地方(数据库、文件系统等)

【讨论】:

-1,它是一个网络应用程序。我们必须将它存储在某个地方并自动运行。 作为一个 Web 应用程序有什么关系?您将变量存储在某处(无论是数据库、文件系统还是其他任何地方)并根据请求检查它们。这里的问题是重置计数器,而不是存储或访问计数器。 好的,假设他存储在数据库中,应用程序何时检查日期?我的意思是参加什么活动? 每当他进入柜台时 谢谢@defaultlocale,我也觉得这一次很不合理,但是我想每个人都有权发表意见:-)【参考方案2】:

我会将呼叫存储到数据库中,然后选择当天哪些组来显示呼叫总数等。

这样它会在新的一天开始时自动为您重置,您无需担心 IIS 重置会破坏您的内存数据。

如果您不希望过于频繁地查询对性能造成影响,可以使用许多缓存选项。

【讨论】:

我确实想避免经常查询,所以你能详细说明一下缓存选项吗?谢谢。 Asp.Net 中的数据缓存 - 教程在这里:weblogs.asp.net/dotnetstories/archive/2011/02/15/… 和一个 SO 链接在这里***.com/questions/7462298/data-caching-in-asp-net 我会在您的解决方案中添加除了保存呼叫之外,我会制作一个单独的表格,其中包含一个日期字段和两个计数器字段,并在打开或关闭呼叫时添加到相应的计数器。跨度> 【参考方案3】:

我想你可以使用Application_BeginRequest 方法。使用布尔值查看当天是否已经运行。

另一个选项是一个带有隐藏 URL 的调度程序来重置。

【讨论】:

【参考方案4】:

您可以在 IIS 中配置Periodic Restart Settings for Application Pool Recycling:

该元素包含允许您控制应用程序池何时回收的配置设置。您可以指定 Internet 信息服务 (IIS) 7 在某个时间间隔(以分钟为单位)后或在每天的特定时间回收应用程序池。您还可以将 IIS 配置为根据应用程序池中的工作进程正在使用的虚拟内存或物理内存量进行回收,或将 IIS 配置为在工作进程处理特定数量的请求后回收应用程序池。

但这有一个副作用,即在池重新启动期间使应用程序脱机,因此如果您当时有任何用户连接,它将失去其会话。这可以通过在没有用户连接的时候重新启动应用程序来最小化,比如黎明时分。

以下配置 sn -p 将应用程序池设置为每天凌晨 3:00 回收:

<add name="Example">
   <recycling logEventOnRecycle="Schedule">
     <periodicRestart>
       <schedule>
          <clear />
          <add value="03:00:00" />
        </schedule>
     </periodicRestart>
   </recycling>
 <processModel identityType="NetworkService" shutdownTimeLimit="00:00:30" startupTimeLimit="00:00:30" />
</add>

【讨论】:

肯定让应用程序池离线不是解决这个问题的方法吗?我不知道网站可用性要求,但我一直认为定期是“弥补不良编程”,正如 Chris Lively 在这里雄辩地说:***.com/questions/2043031/… 在这种特殊情况下的讨论是关于清理内存垃圾,如果确实需要为此重新启动 Web 服务器。 Chris Lively 将这些内存垃圾与糟糕的编程联系起来,并表示最好在开始回收池之前检查应用程序。 这就是我的观点 - 正如您所说,该功能可以处理清理垃圾,而不是重置变量。 IMO 似乎有点极端

以上是关于如何每天重置应用程序变量的主要内容,如果未能解决你的问题,请参考以下文章

如何制作 Python 程序,以便即使在终止后,变量、列表和其他对象的值也不会重置?

Vuex 存储状态:如何将函数与变量混合以单次重置状态值

如何在重置之前向日志添加值(CoreData 和 Swift)

AS3:如何从影片剪辑内部检查和重置主时间轴上的变量

Dart 每天午夜重置字段

iOS - 如何重置到新状态