如何在 Classic ASP 中安排定期数据库清理任务?
-
19-09-2019 - |
题
我有一个经典 ASP 站点,需要按计划清空一些数据库表中的会话数据。该系统无法访问计划任务(它位于共享 Web 主机上,并使用 MySQL 服务器)
我正在考虑使用 global.asa
, ,触发这样的事件:
Application_OnStart
- 从数据库中删除所有会话数据Application_OnEnd
- 删除所有会话数据Session_OnStart
- 创建用户会话Session_OnEnd
- 删除与该会话相关的所有会话数据。
有什么理由我不应该在中创建数据库连接 global.asa
?这些将在这里创建和销毁,不会在会话或应用程序范围内共享。我将其视为每个用户运行这些管理任务两次(在会话开始和结束时)的一种方式,并且不会再次触发它们,相当于很少的数据库流量。
任何人都知道为什么这可能不好?无法连接到数据库的任何原因 global.asa
?
如果有人认为上述想法不好 - 对于我如何定期清空这些表而不需要以下一项或多项,您还有其他想法吗?
- 计划任务
- 数据库定时任务
- 在每个页面的页面加载时运行代码(因此
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,我不会感到惊讶。如果没有,您可以自己写一个,选择是无穷无尽的:)