在数据库更新期间防止会话超时
背景
Web应用程序调用存储过程以执行密集数据库更新。 web.xml
的相关部分更新为四小时:
240
可用于该解决方案的技术包括Java 1.4.2,Struts 2,Tomcat 5.5和Apache commons。 大多数其他技术(例如jQuery)是不允许的。
问题
更新大约需要一个小时才能运行,但是四小时的配置值违反了公司标准(有充分理由)。 生产中不允许四小时超时配置。
题
在数据库更新执行时,什么将确保请求不会超时?
思路
前两种情况我担心的是,生成的进程最终将被Servlet容器杀死。
页面刷新
- 将数据库更新过程生成为后台任务。
- 让Servlet不断刷新页面以检查完成情况。
JavaScript Ping
- 将数据库更新过程生成为后台任务。
- 让JavaScript代码ping服务器一段时间。
类似于在JSF中长时间处理期间防止会话超时 ,但没有jQuery。
更新服务器
编写一个侦听请求的简单服务器:
- Servlet向侦听器发送请求。
- 侦听器运行更新。
由于服务器独立于Tomcat运行,因此不会发生会话超时。 数据库更新将运行完成而不会被终止。 这有很多问题(error handling不是我最关心的问题),并且可能是最后的选择。
优化
优化查询以在30分钟内完成(最大允许超时)是可能的,但很可能无法充分优化查询。
硬件
不幸的是,升级数据库硬件不是一种选择。
非常感谢!
在我看来,没有用户会想坐在屏幕前监视后台工作4个小时。 几年前,我不得不实施耗时数小时的报告生成。 实施的解决方案如下:
- 在后台线程中生成报告。 通过应用程序上下文列表监视并提供该线程。 该主题包含有关所有者及其进度的信息。
- 用户可以列出自己的线程并查看进度。
- 完成后,报告线程将存储报告以供脱机访问,向所有者发送电子邮件通知,并提供下载生成的报告的链接。
通过阅读abvoe,我可以确保你有两个选择,即使第二个很难,它是最好的过程
1)页面刷新
- 将数据库更新过程生成为后台任务。
- 让Servlet不断刷新页面以检查完成情况。
2)优化
优化查询以在30分钟内完成(最大允许超时)是可能的,但很可能无法充分优化查询。