对于sql:
select job_names.job_name from cover_rage_job_org as org RIGHT JOIN ( select job_names.job_name as job_name from ( SELECT '1' as job_name ) job_name_all) as job_names on job_names.job_name = org.job_name
,sqlparser会卡住
List sqlStatements = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); for (SQLStatement sqlStatement : sqlStatements) { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); sqlStatement.accept(visitor); }
在com.alibaba.druid.sql.visitor.SchemaStatVisitor unwrapExpr 这个表达式上会卡住, 建议在825行附近增加逻辑:
if (selectItem != null) { SQLExpr expr1 = selectItem.getExpr(); if (expr1.equals(expr)) { break; } expr = expr1; continue; }
使用的是1.1.12的druid版本
原提问者GitHub用户yanshuai
供的SQL语句包含了RIGHT JOIN,sqlparser分析这个SQL时可能会出现性能问题。
可以尝试以下解决方法:
升级Druid版本。不同版本的Druid对SQL的解析性能有所不同,你可以尝试使用最新的Druid版本。
简化SQL语句。尽量避免使用RIGHT JOIN,使用普通的INNER JOIN或LEFT JOIN会更高效。
限制解析范围。你可以在SchemaStatVisitor中限制转化AST节点的深度,以避免解析关键字密集的语句。
避免在循环内解析SQL。像你的示例代码那样,在循环内解析每一个SQL会影响性能。
自行编写SQL解析器。如果Druid解析器无法满足性能要求,你也可以考虑自行编写基于规则的SQL解析器。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。