杀死另一个应用程序创建的查询

时间:2014-07-17 06:54:41

标签: java mysql sql database kill

我有一个Java应用程序,我希望能够终止对多个数据库的查询。我知道如何在information_schema.processlist中获取查询,但问题是我不知道如何杀死这些查询。通常我会使用KILL命令来做,但我不能在java应用程序中使用它(或者至少我还没弄明白该怎么做)。

我一直在阅读Statement.cancel,但问题是查询是由另一个应用程序创建的。我知道你必须在要取消它的类中有Statement变量。

如果我可以为此目的使用Statement,有人可以帮助我理解如何。我正在使用MySQL数据库。我不想设置超时,因为我希望能够杀死我想要的任何查询。

这些是我试图杀死这个过程的一些例子:

public synchronized void killProcesses(Set<Long> ids) {
    for (long id : ids) {
        String killCommand="Select 'KILL ' from processlist where id=:id";

        Query query= queryManager.createQuery(killCommand);
        query.setParameter("id", id);
        query.getResultList();
    }
}

public synchronized void killProcesses(Set<Long> ids) {
    for (long id : ids) {
        String killCommand="KILL " + id;

        Query query= queryManager.createQuery(killCommand);
        query.getResultList();
    }
}

1 个答案:

答案 0 :(得分:0)

@HannoBinder解决了这个问题,最终的解决方案是:

private String killQuery(long id) {
    String killCommand="KILL " + id;
    queryManager.getTransaction().begin();
    Query query=queryManager.createNativeQuery(killCommand);
    query.executeUpdate();
    queryManager.getTransaction().commit();
    return "OK";
}

也是一个有效的,但不是那么简单:

public synchronized void killProcesses(Set<Long> ids) {
    for (long id : ids) {
        String killCommand="KILL QUERY " + id;
        queryManager.getTransaction().begin();
        Connection conn=queryManager.unwrap(Connection.class);
        try {
            Statement statement= conn.createStatement();
            statement.execute(killCommand);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
                queryManager.getTransaction().commit();
                conn.close();   
        }

    }
}