背景
一个Web应用程序调用一个存储过程执行一个密集的数据库更新操作。相应部分的web.xml
文件已被更新为四小时:
<session-config>
<session-timeout>240</session-timeout>
</session-config>
可用于此解决方案的技术包括Java 1.4.2,Struts 2,Tomcat 5.5和Apache commons。大多数其他技术(如jQuery)不允许。
问题
更新需要运行约一小时,但是四小时的配置值违反了企业标准(有很好的原因)。生产环境不允许四小时的超时配置。
问题
如何确保请求在数据库更新执行期间不会超时?
想法
我在前两种情况下担心生成的进程最终将被Servlet容器杀死。
页面刷新
- 将数据库更新进程作为后台任务启动。
- 使用Servlet持续刷新页面以检查是否完成。
JavaScript Ping
- 将数据库更新进程作为后台任务启动。
- 使用JavaScript代码向服务器发送ping。
类似于防止JSF中长时间处理时间的会话超时,但没有jQuery。
更新服务器
编写一个简单的服务器来监听请求:
- Servlet向监听器发送请求。
- 监听器运行更新。
由于该服务器独立于Tomcat运行,因此会话超时不会发生。数据库更新将在不被终止的情况下完成。然而这种方法存在许多问题(错误处理是其中最大的问题),很可能是最后的选择。
优化
优化查询以在30分钟内完成(最大允许的超时时间)是可能的,但很可能无法足够地优化查询。
硬件
升级数据库硬件不是一个选项,不幸的是。
非常感谢!