[alibaba/druid]解析长sql的时候,无法中断解析过程

2025-11-10 779 views
1

在使用 druid 解析长 sql 时,会出现整个线程使用率达 100 %,且无法中断的问题 相关代码:

        SQLStatement statement;
        MySqlSchemaStatVisitor visitor;
        try {
            statement = SQLUtils.parseSingleMysqlStatement(sql);
            visitor = new MySqlSchemaStatVisitor();
            statement.accept(visitor);
        } catch (Exception e) {
            e.printStackTrace();
        }

通过火焰图分析,整个 sql 解析大部分时间耗在了 SchemaStatVisitor 的column解析中

通过 thread dump 可以更清晰的看到对应的代码行数

回答

8

sql parse 本来就是一个计算密集型的操作。

1

sql parse 本来就是一个计算密集型的操作。

作为计算密集型操作,提供一些中断的机制是不是可以更好的控制计算资源的消耗呢。因为在处理长 sql 时,如果处理时间太久,又没有办法中断当前的操作(或者说当前线程),只能看着对应的 cpu 资源白白浪费,没法用来处理后续的 sql 了。当然这本身也可以通过解析前拦截掉一些长 sql 来避免 ,不过如果 druid 能提供这种中断机制,也可以更有效的控制解析过程。

2

那不是一个确定的目标,也超出了德鲁伊的设计范围。