我有一个经典ASP站点,需要按计划从会话数据中清空一些数据库表。该系统无法访问计划任务(它位于共享Web主机上,并使用MySQL服务器)
我正在考虑使用global.asa
来解雇事件:
Application_OnStart
- 删除数据库中的所有会话数据Application_OnEnd
- 删除所有会话数据Session_OnStart
- 创建用户'会话Session_OnEnd
- 删除与此会话相关的所有会话数据。为什么我不应该在global.asa
中创建数据库连接?这些将在此处创建和销毁,不会在会话或应用程序范围上共享。我认为这是一种每个用户运行这些管理任务两次的方式(在会话开始和结束时),并且不再为它们再次触发,等同于非常少的数据库流量。
任何人都有任何想法,为什么这可能是坏的?有没有连接到global.asa
中的数据库的原因?
如果有人认为上述想法很糟糕 - 你是否有任何其他想法如何在没有一个或多个的情况下定期清空这些表:
Session_OnStart
挂钩)TA'
高级椰子
答案 0 :(得分:3)
这取决于您的清理任务需要多长时间。由于在Application_Start运行时不会提供任何请求,因此可能会阻塞一段时间。
此外,您无法保证在所有情况下都会调用Application_End(或Session_End)(当服务器关闭时,它可能不会被触发,或者某些灾难性故障可能会完全绕过这些事件。)
正如您所建议的那样,最好的办法是运行一个负责清理陈旧会话数据的计划任务。
答案 1 :(得分:3)
您可以编写一个清空会话表的网页,并通过计划任务从外部框中调用该页面。
答案 2 :(得分:2)
我会为Session_OnEnd
中的单个会话以及Application_OnStart
中的所有会话进行清理。如果你的all-sessions-cleanup很慢,你可以做一个丑陋的事情并把它清理放在一个单独的asp文件中,你使用XMLHTTP类做一个http请求,记得不要等待请求完成,因为它在Application_OnStart
中的所有代码运行之前,不会开始提供服务。
答案 3 :(得分:0)
如果您拥有一致的流量,您可以在请求周期结束时捎带小任务。只需发出response.flush,然后执行db查询。当然你需要编写自己的调度程序。另一种选择是创建一个单独的asp文件(tasklet),您可以在请求开始时使用serverside,async,xmlhttpreq进行ping操作。这使清理代码远离客户端请求周期并减少延迟。
实际上,如果没有一些基于webappr / api的聪明的基于webappr / api可以按计划ping你遗留的tasklet / webhook,我不会感到惊讶。如果没有,你可以写一个你自己,选择是无止境的:)