【问题标题】:How to stop a running mysql query如何停止正在运行的 mysql 查询
【发布时间】:2011-01-05 03:25:27
【问题描述】:

如何以编程方式停止正在运行的 mysql 查询?

我面临的问题是查询是使用用户提供的数据构建的,并且有时可能需要很长时间才能执行(大型表 15 - 3000 万行)。我想为用户提供一个取消选项,但不知道如何停止当前正在执行的 mysql-query。

该应用程序是一个Java applet-servlet:用户在applet 中指定标准,该标准被传递给servlet,其中创建了一个处理程序类来处理请求。这个处理程序类是自包含的重新连接-查询-断开到mysql。

在这种情况下,如何取消正在运行的 mysql-query?

【问题讨论】:

  • 小心点,如果你杀死一个查询会导致你的表崩溃
  • @slashmais 你能帮我解决你让用户使用 java-servlets 停止或终止查询的代码吗,我也有同样的问题
  • @dheerajkumar:我为客户编写了代码,现在无法再访问它了。 IIRC 我通读了答案并构建了一个可行的方案。
  • @slashmais yupp 我还得做点别的,因为这会导致问题

标签: java mysql applet-servlet


【解决方案1】:
SHOW PROCESSLIST;
KILL <thread_to_be_killed>;

有关更多详细信息,请参阅文档

Show The Process List

Kill A Running Thread

【讨论】:

  • 在这种情况下,使用 KILL QUERY 比 KILL 稍微好一些。这样查询就被杀死了,但不是连接引用#“*.com/questions/3787651/…”中的评论
【解决方案2】:

需要一个单独的 JDBC 连接,这意味着您必须创建一个新的数据库处理程序实例。执行SHOW PROCESSLIST 语句,然后循环遍历结果并为给定用户找到的每个线程ID 执行KILL 语句。

我能想到的唯一可靠的方法是每个用户都必须以不同的用户名登录到数据库,然后获取该用户的所有线程 ID 并终止他们的所有线程。

【讨论】:

    【解决方案3】:

    您可以通过 MySQL 提供的标准库发出 MySQL 特定命令并运行KILL QUERY。可能最好列出进程并确定您需要首先杀死哪个线程。

    但根据您的应用程序,这可能会产生安全问题(因为您需要为连接的应用程序用户提供更多权限)。

    【讨论】: