Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 终止由另一个应用程序创建的查询_Java_Mysql_Sql_Database_Kill - Fatal编程技术网

Java 终止由另一个应用程序创建的查询

Java 终止由另一个应用程序创建的查询,java,mysql,sql,database,kill,Java,Mysql,Sql,Database,Kill,我有一个Java应用程序,希望能够终止对多个数据库的查询。我知道如何在information_schema.processlist中获取查询,但问题是我不知道如何终止这些查询。通常我会使用KILL命令来做,但我不能在java应用程序中使用它(或者至少我还没有弄清楚如何做) 我一直在阅读有关语句的内容。cancel,但问题是查询是由另一个应用程序创建的。我明白了,在想要取消语句变量的类中必须有语句变量 如果我可以使用这个语句,请有人帮助我了解如何使用。我正在使用MySQL数据库。我不想设置超时,因

我有一个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。