我有一个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();
}
}
答案 0 :(得分:0)
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();
}
}
}