我有一个运行数据库查询的Java servlet,在尝试写入响应流之前可能需要几分钟才能运行。在数据库查询期间,用户可能已断开连接(从而使查询无效)。
因为我无法在数据库线程中杀死它,所以我试图从另一个线程中删除它。是否有任何servlet容器提供了“取消”或“杀死”请求线程的推荐方法?如果我携带对线程的引用,我可以强制中断或类似吗?
答案 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)
- 如果您正在运行一个小时的数据库查询,则不应该先进行 从servlet发出调用,因为响应流将超时,你会 得到 504 。
- 我可以知道这个查询正在做什么,涉及到什么 计算和大更新或 的插入件。
- 您应该尝试将此查询放在DB JOBS中。
醇>
答案 2 :(得分:0)
您可java.sql.Statement.cancel()
您必须在某处(ServletContext
或您认为合适的任何结构)注册正在运行的语句,并在完成后取消注册。
JDBC驱动程序也必须支持这种方法(cancel()
),我不知道PostgreSQL是否支持它,不过