如何从另一个servlet中终止长时间运行的servlet进程?

时间:2011-02-12 13:29:35

标签: java multithreading servlets

我有一个运行数据库查询的Java servlet,在尝试写入响应流之前可能需要几分钟才能运行。在数据库查询期间,用户可能已断开连接(从而使查询无效)。

因为我无法在数据库线程中杀死它,所以我试图从另一个线程中删除它。是否有任何servlet容器提供了“取消”或“杀死”请求线程的推荐方法?如果我携带对线程的引用,我可以强制中断或类似吗?

3 个答案:

答案 0 :(得分:1)

游览问题不是关于java线程。它是关于将数据库查询导入数据库。我说是因为据我所知,你的问题是,客户端向执行JDBC连接的servlet发送HTTP请求并运行需要花费大量时间的查询。所以,java这次不起作用。数据库确实如此。这意味着您必须将数据库查询终止到数据库中。这该怎么做?这取决于您的数据库。 MySql(例如)有一种命令行shell,允许检索当前查询列表并终止查询。所以这就是你能做的。您的第二个servlet可以连接到MySql,检索正在运行的查询,确定哪个应该被杀死(这是特定于应用程序的功能)并将其终止。我相信一旦你这样做,第一个servlet将获得JDBCException并可以退出。

这是显示正在运行的查询列表的方法: http://www.electrictoolbox.com/show-running-queries-mysql/

以下是查杀的方法: http://dev.mysql.com/doc/refman/5.0/en/kill.html

最后一点可能应该是第一个。检查为什么你的查询花了这么长时间?在大多数情况下,恕我直言,这意味着您的架构不是最优的或缺少某些索引。通常,如果查询时间超过0.1秒,请检查数据库架构。

答案 1 :(得分:0)

  
      
  1. 如果您正在运行一个小时的数据库查询,则不应该先进行   从servlet发出调用,因为响应流将超时,你会   得到 504
  2.   
  3. 我可以知道这个查询正在做什么,涉及到什么   计算和大更新或   的插入件。
  4.   
  5. 您应该尝试将此查询放在DB JOBS中。
  6.   

答案 2 :(得分:0)

您可java.sql.Statement.cancel()您必须在某处(ServletContext或您认为合适的任何结构)注册正在运行的语句,并在完成后取消注册。

JDBC驱动程序也必须支持这种方法(cancel()),我不知道PostgreSQL是否支持它,不过