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

时间:2011-05-11 08:34:16

标签: java tomcat session-timeout

背景

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不断刷新页面以检查是否完成。
  3. JavaScript Ping

    1. 将数据库更新过程生成为后台任务。
    2. 让JavaScript代码ping服务器一段时间。
    3. Preventing session timeout during long processing time in JSF类似,但没有jQuery。

      更新服务器

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

      1. Servlet向侦听器发送请求。
      2. 侦听器运行更新。
      3. 由于服务器独立于Tomcat运行,因此不会发生会话超时。数据库更新将运行完成而不会被终止。这有很多问题(错误处理不是我最关心的问题),并且可能是最后的选择。

        优化

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

        硬件

        不幸的是,升级数据库硬件不是一种选择。

        非常感谢!

2 个答案:

答案 0 :(得分:4)

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

  • 在后台线程中生成报告。线程已通过应用程序上下文列表进行监视和可用。该主题包含有关所有者及其进度的信息。
  • 用户可以列出自己的主题并查看进度。
  • 完成后,报告主题会存储报告以供离线访问,向所有者发送电子邮件通知,并附带下载生成报告的链接。

答案 1 :(得分:1)

通过阅读abvoe,我可以确保你有两个选择,即使第二个很难,它是最好的过程

1)页面刷新

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

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