开发者社区> 问答> 正文

不支持kill <processlist_id>解析

mysql数据库支持KILL [CONNECTION | QUERY] processlist_id druid库解析必须要让sql带有CONNECTION 或QUERY,与mysql行为不符合

麻烦修改,谢谢 附带个人修改方案MySqlStatementParser.java :

@Override public SQLStatement parseKill() { accept(Token.KILL);

MySqlKillStatement stmt = new MySqlKillStatement();

if (identifierEquals("CONNECTION")) {
    System.out.println(lexer.stringVal());
    stmt.setType(MySqlKillStatement.Type.CONNECTION);
    lexer.nextToken();
} else if (identifierEquals("QUERY")) {
    stmt.setType(MySqlKillStatement.Type.QUERY);
    lexer.nextToken();
} else if (lexer.token() == Token.LITERAL_INT) {
    try {
        Long.parseLong(lexer.numberString());
        // if no [QUERY|CONNECTION], the behavior is same as CONNECTION
        // by MYSQL 5.6.24
        stmt.setType(MySqlKillStatement.Type.CONNECTION);
    } catch (Exception e) {
        throw new ParserException("not support kill " + lexer.numberString());
    }
} else {
    throw new ParserException("not support kill type " + lexer.token());
}
SQLExpr threadId = this.exprParser.expr();
stmt.setThreadId(threadId);
return stmt;

}

原提问者GitHub用户terryzhu

展开
收起
山海行 2023-07-05 21:40:36 57 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    MySQL数据库支持使用KILL命令来终止正在执行的进程,包括连接和查询。可以使用KILL命令来终止指定进程的执行,语法如下:

    Copy
    KILL [CONNECTION | QUERY] processlist_id
    其中,processlist_id是进程的ID号,可以使用SHOW PROCESSLIST命令来查看当前正在执行的进程列表。

    在MySQL中,KILL命令可以指定终止连接或查询,使用CONNECTION关键字终止连接,使用QUERY关键字终止查询。如果没有指定关键字,则默认为终止查询。这个行为与Druid库解析的SQL语法不一致,因为Druid库解析的SQL语法要求在KILL命令中必须指定CONNECTION或QUERY关键字。

    如果需要在Druid库解析中使用KILL命令终止进程,可以尝试使用以下SQL语句:

    Copy
    KILL CONNECTION processlist_id
    在这个SQL语句中,明确指定要终止的是连接,而不是查询。这样,Druid库解析就可以正确解析这个SQL语句,并执行终止操作。

    2023-07-30 09:39:33
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    以下是对MySqlStatementParser.java的修改方案,以支持您的需求:

    @Override
    public SQLStatement parseKill() {
      accept(Token.KILL);
    
      MySqlKillStatement stmt = new MySqlKillStatement();
    
      if (lexer.token() == Token.LITERAL_INT) {
        SQLExpr threadId = this.exprParser.expr();
        stmt.setThreadId(threadId);
        return stmt;
      } else {
        String killType = lexer.stringVal().toUpperCase();
        stmt.setKillType(killType);
        lexer.nextToken();
        SQLExpr threadId = this.exprParser.expr();
        stmt.setThreadId(threadId);
        return stmt;
      }
    }
    

    上述修改的关键是根据解析器当前的token判断是否为LITERAL_INT类型,如果是,则直接将其作为线程ID,如果不是,则将其作为kill类型,并在解析完类型后继续解析线程ID。

    请注意,这只是对Druid库解析器的修改建议,实际应用中可能需要进行更详细的测试和验证。如果您对Druid库有特定版本或其他定制化需求,请确保在修改之前对代码进行备份,并仔细测试修改后的解析器行为是否符合预期。

    希望以上修改方案能够帮助您解决问题。如果您有其他问题或需要进一步的帮助,请随时告诉我。

    2023-07-11 17:13:34
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 12:22:36
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像