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

10

背景

一个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分钟内完成(最大允许的超时时间)是可能的,但很可能无法足够地优化查询。

硬件

升级数据库硬件不是一个选项,不幸的是。

非常感谢!


在Memcached中的会话怎么样?http://code.google.com/p/memcached-session-manager/ - lschin
我认为你已经回答了自己的问题,不是吗?正如你所写,你需要将升级作为后台任务运行,并且要么进行页面刷新,要么进行Ajax轮询以显示任务的当前状态。 - Peter Štibraný
Tomcat不应该杀死您生成的线程或进程。当然,如果您杀死整个Tomcat,那么您的线程也会消失。当您的应用程序重新部署时,您可能会遇到后台线程的问题,但管理员在运行后台任务时重新部署应该小心(您还可以监听Web应用程序的关闭/启动)。 - Peter Štibraný
2个回答

4
在我看来,没有用户会想要在屏幕前监视一个4小时的后台作业。几年前,我不得不实现需要花费数小时的报告生成。实现的解决方案如下:
  • 在后台线程中生成报告。该线程通过应用程序上下文列表进行监视和访问。线程包含有关所有者及其进度的信息。
  • 用户可以列出自己的线程并查看进度。
  • 完成报告线程后,将存储报告以供离线访问,并向所有者发送电子邮件通知,其中包含下载生成的报告的链接。

这是一个内部开发项目。它并不太复杂(线程列表、生成线程一旦完成就从列表中移除以及用于列表的监控页面)。如果我今天要重新构建它,我可能会基于Quartz调度框架,因为我可以将这个工作重复使用在许多其他事情上。 - Pierre

1

通过阅读上述内容,我可以确保您有两个选择,尽管第二个选择很困难,但它是最好的过程。

1)页面刷新

  1. 将数据库更新进程作为后台任务生成。
  2. 使用Servlet不断刷新页面以检查完成情况。

2)优化

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接