背景
Web 应用程序调用存储过程来执行密集的数据库更新。的相关部分web.xml
更新为四小时:
<session-config>
<session-timeout>240</session-timeout>
</session-config>
该解决方案可用的技术包括 Java 1.4.2、Struts 2、Tomcat 5.5 和 Apache commons。大多数其他技术(例如 jQuery)都是不允许的。
Problem
更新大约需要一个小时才能运行,但是四个小时的配置值违反了公司标准(有充分的理由)。生产中不允许使用四小时超时配置。
Question
如何确保执行数据库更新时请求不会超时?
Ideas
我对前两种情况的担忧是,生成的进程最终会被 Servlet 容器杀死。
页面刷新
- 将数据库更新过程作为后台任务生成。
- 让 Servlet 不断刷新页面以检查是否完成。
JavaScript 平
- 将数据库更新过程作为后台任务生成。
- 让 JavaScript 代码对服务器执行 ping 操作一段时间。
如同在 JSF 中防止长时间处理期间会话超时 https://stackoverflow.com/questions/4525171/preventing-session-timeout-during-long-processing-time-in-jsf,但没有 jQuery。
更新服务器
编写一个简单的服务器来监听请求:
- Servlet 向侦听器发送请求。
- 侦听器运行更新。
由于服务器独立于Tomcat运行,因此不会发生会话超时。数据库更新将运行至完成而不会被终止。这有很多问题(错误处理不是我最关心的),并且可能是最后的选择。
优化
优化查询以在 30 分钟(允许的最大超时)内完成是可能的,但查询可能无法充分优化。
Hardware
不幸的是,升级数据库硬件不是一个选择。
非常感谢!
在我看来,没有用户愿意坐在屏幕前监视后台作业 4 个小时。几年前,我不得不花费数小时来实现报告生成。实施的解决方案如下:
- 在后台线程中生成报告。该线程通过应用程序上下文列表进行监视和可用。该线程包含有关所有者及其进度的信息。
- 用户可以列出自己的线程并查看进度。
- 完成后,报告线程将存储报告以供离线访问,向所有者发送电子邮件通知,其中包含下载生成报告的链接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)