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
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语句,并执行终止操作。
以下是对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库有特定版本或其他定制化需求,请确保在修改之前对代码进行备份,并仔细测试修改后的解析器行为是否符合预期。
希望以上修改方案能够帮助您解决问题。如果您有其他问题或需要进一步的帮助,请随时告诉我。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。