Java 终止由另一个应用程序创建的查询
我有一个Java应用程序,希望能够终止对多个数据库的查询。我知道如何在information_schema.processlist中获取查询,但问题是我不知道如何终止这些查询。通常我会使用KILL命令来做,但我不能在java应用程序中使用它(或者至少我还没有弄清楚如何做) 我一直在阅读有关语句的内容。cancel,但问题是查询是由另一个应用程序创建的。我明白了,在想要取消语句变量的类中必须有语句变量 如果我可以使用这个语句,请有人帮助我了解如何使用。我正在使用MySQL数据库。我不想设置超时,因为我想能够终止任何我想终止的查询 以下是我如何尝试终止流程的一些示例:Java 终止由另一个应用程序创建的查询,java,mysql,sql,database,kill,Java,Mysql,Sql,Database,Kill,我有一个Java应用程序,希望能够终止对多个数据库的查询。我知道如何在information_schema.processlist中获取查询,但问题是我不知道如何终止这些查询。通常我会使用KILL命令来做,但我不能在java应用程序中使用它(或者至少我还没有弄清楚如何做) 我一直在阅读有关语句的内容。cancel,但问题是查询是由另一个应用程序创建的。我明白了,在想要取消语句变量的类中必须有语句变量 如果我可以使用这个语句,请有人帮助我了解如何使用。我正在使用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();
}
}
公共进程(设置ID){
用于(长id:id){
String killCommand=“从processlist中选择'KILL',其中id=:id”;
Query Query=queryManager.createQuery(killCommand);
query.setParameter(“id”,id);
getResultList();
}
}
公共同步进程(设置ID){
用于(长id:id){
字符串killCommand=“KILL”+id;
Query Query=queryManager.createQuery(killCommand);
getResultList();
}
}
@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();
}
}
}
公共进程(设置ID){
用于(长id:id){
字符串killCommand=“KILL QUERY”+id;
queryManager.getTransaction().begin();
连接conn=queryManager.unwrap(Connection.class);
试一试{
语句Statement=conn.createStatement();
语句。执行(killCommand);
}捕获(SQLE异常){
e、 printStackTrace();
}最后{
queryManager.getTransaction().commit();
康涅狄格州关闭();
}
}
}
第二次尝试时出现了什么问题/错误消息?我认为您应该尝试而不是尝试getResultList()
@HannoBinder我得到的异常是:异常描述:语法错误解析[KILL QUERY71427]。[0,15]查询不是以有效标识符开始的,必须是SELECT、UPDATE或DELETE FROM。请使用Statement.execute()
执行任意SQL。正如异常所说,您使用的方法只支持select、update或DELETE。我尝试了query.executeUpdate()
,但得到了几乎相同的异常。语句的问题是我使用了entityManager,所以我无法创建语句,但我想我会尝试打开连接并使用它创建语句。我尝试打开连接并创建并执行语句,但我得到了nullpointer。似乎queryManager.unwrap(Connection.class)
返回null。我最初认为这是因为我总是在事务结束后关闭连接,但我从persistence.xml中删除了它,它仍然不起作用。我用的是Eclipselink。