0

我有一个经典的 ASP 站点,它需要按计划从会话数据中清空一些数据库表。此系统无权访问计划任务(它位于共享 Web 主机上,并使用 MySQL 服务器)

我正在考虑使用global.asa, 来触发这样的事件:

  1. Application_OnStart- 从数据库中删除所有会话数据
  2. Application_OnEnd- 删除所有会话数据
  3. Session_OnStart- 创建用户会话
  4. Session_OnEnd- 删除与此会话相关的所有会话数据。

有什么理由不应该在其中创建数据库连接global.asa吗?这些将在此处创建和销毁,不会在会话或应用程序范围内共享。我将其视为每个用户(在会话开始和结束时)运行这些管理任务两次并且不会因为它们再次被触发而等同于非常少的数据库流量的一种方式。

有人对为什么这可能不好有任何想法吗?有什么理由不连接到数据库global.asa

如果有人认为上述想法是一个糟糕的想法 - 对于我如何定期清空这些表格,您是否还有其他想法,而无需以下一项或多项:

  1. 计划任务
  2. 数据库计划任务
  3. 在每个页面的页面加载上运行代码(因此是Session_OnStart钩子)

塔'

高级椰子

4

4 回答 4

3

这取决于您的清理任务需要多长时间。由于在 Application_Start 运行时不会处理任何请求,因此它可能会阻塞一段时间。

此外,您无法保证在所有情况下都会调用 Application_End(或 Session_End)(当服务器关闭时,它可能不会被触发,或者某些灾难性故障可能会完全绕过这些事件)。

正如您所建议的,最好的方法是运行一个计划任务来负责清理陈旧的会话数据。

于 2009-11-10T13:05:25.747 回答
3

您可以编写一个清空会话表的网页,并通过计划任务从外部框调用该页面。

于 2009-11-10T13:17:22.773 回答
2

我会为单个会话Session_OnEndApplication_OnStart. 如果你的 all-sessions-cleanup 很慢,你可以做一件丑陋的事情并将清理放在一个单独的 asp 文件中,你可以使用 XMLHTTP 类发出 http-request,记住不要等待请求完成在所有代码Application_OnStart运行之前不会开始提供服务。

于 2009-11-10T15:23:13.633 回答
0

如果您有稳定的流量,您可以在请求周期结束时搭载小任务。只需发出一个 response.flush 然后执行数据库查询。当然,您需要编写自己的调度程序。另一种选择是创建一个单独的 asp 文件(tasklet),您在请求开始时使用服务器端、异步、xmlhttpreq 对其进行 ping。这使清理代码远离客户端请求周期并减少延迟。

实际上,如果还没有一些聪明的基于 appengine 的 webappr/api 可以按时 ping 你的遗留 tasklet/webhooks,我不会感到惊讶。如果没有,你可以自己写一个,选择是无穷无尽的:)

于 2009-11-10T23:41:13.877 回答