一尘不染

防止数据库更新期间会话超时

tomcat

背景

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容器杀死。

页面刷新

  1. 将数据库更新过程生成为后台任务。
  2. 让Servlet不断刷新页面以检查是否完成。

JavaScript Ping

  1. 将数据库更新过程生成为后台任务。
  2. 让JavaScript代码ping服务器一段时间。

类似于在JSF中防止长时间处理期间会话超时,但没有jQuery。

更新服务器

编写一个简单的服务器来侦听请求:

  1. Servlet将请求发送到侦听器。
  2. 侦听器运行更新。

由于服务器独立于Tomcat运行,因此不会发生会话超时。数据库更新将完全运行而不会被杀死。这有很多问题(错误处理并不是我最关心的问题),并且很可能是最后的选择。

优化

可以优化查询以在30分钟以内完成(最大允许超时),但是可能无法充分优化查询。

硬件

不幸的是,无法升级数据库硬件。

非常感谢!


阅读 218

收藏
2020-06-16

共1个答案

一尘不染

在我看来,没有用户愿意坐在屏幕前监视后台工作4个小时。几年前,我不得不实施耗时数小时的报告生成。实施的解决方案如下:

  • 在后台线程中生成报告。该线程已受到监视,并可以通过应用程序上下文列表使用。该线程包含有关所有者及其进度的信息。
  • 用户可以列出自己的线程并查看进度。
  • 完成后,报告线程将存储该报告以供脱机访问,并通过链接向所有者发送电子邮件通知以下载生成的报告。
2020-06-16