我有一个经典 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 钩子)

塔'

高级椰子

有帮助吗?

解决方案

我会在单个会话中进行清理 Session_OnEnd 对于所有会话 Application_OnStart. 。如果你的所有会话清理很慢,你可以做一件丑陋的事情,并将清理放在一个单独的 asp 文件中,你使用 XMLHTTP 类向该文件发出 http 请求,记住不要等待请求完成,因为它在所有代码输入之前不会开始提供服务 Application_OnStart 正在运行。

其他提示

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top