开发者社区> 问答> 正文

SQLBinaryOpExpr死循环问题

java.lang.StackOverflowError , at 2017-09-02 10:11 at com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr.equals(SQLBinaryOpExpr.java:160) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:189) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:207) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:207) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:207) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:207) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:207) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:207) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:207) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:207) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:207) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:207) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.merge(ParameterizedOutputVisitorUtils.java:207) ....

项目是运行在storm里的,日志量比较大,所以无法打印sql语句,通过查看storm的错误日志可以看到这里解析到某条sql时会出现死循环导致堆栈溢出.

` WallConfig config = new WallConfig(OracleWallProvider.DEFAULT_CONFIG_DIR); config.setStrictSyntaxCheck(false); config.setConditionDoubleConstAllow(false); config.setConstArithmeticAllow(false);

//支持条件为真
config.setConditionAndAlwayTrueAllow(true);

config.setConditionDoubleConstAllow(true);

//支持算数表达式
config.setConstArithmeticAllow(true);

//支持注解
config.setCommentAllow(true);

this.provider = new OracleWallProvider(config);
WallCheckResult wcr = provider.check(sql);

原提问者GitHub用户freeman983

展开
收起
山海行 2023-07-05 20:43:25 94 0
3 条回答
写回答
取消 提交回答
  • 根据您提供的信息,您遇到了一个SQLBinaryOpExpr死循环的问题,导致堆栈溢出。这个问题是由于使用了阿里巴巴的Druid数据库连接池,其中的SQL解析器在某个特定的SQL语句上发生了死循环。

    根据回答者给出的建议,您可以尝试升级到Druid的新版本来修复这个问题。最新版本是1.1.14,您可以从https://github.com/alibaba/druid/releases/tag/1.1.14下载并使用它。

    另外,在你的代码中,你使用了一些配置参数来设置WallConfig,用于改变Druid的SQL解析和过滤行为。请确保这些配置参数的设置是正确的,并且不会引起其他问题。如果需要,你可以参考Druid的文档或咨询Druid社区获得更多关于这些配置参数的信息和建议。

    总之,升级到最新版本的Druid并检查配置参数是否正确设置,这可能有助于解决SQLBinaryOpExpr死循环的问题。如果问题仍然存在,请考虑向Druid的开发团队报告此问题以获取进一步的支持和帮助。

    2023-07-30 14:12:06
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    心跳检测语句可能不会被记录在数据库的SQL日志中,因为它们通常是由连接池自动发送的,而不是由应用程序直接发送的。如果你需要确认心跳检测语句是否正常工作,可以查看连接池的配置文件或者文档,了解具体的心跳检测设置和机制。

    另外,如果你使用的是JDBC连接,你需要在应用程序中显式地发送心跳检测语句,以确保连接的有效性。在这种情况下,你可以在应用程序中编写相应的代码,定时发送心跳检测语句,并将其记录在SQL日志中,以便跟踪和调试。

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

    原回答者GitHub用户wenshao

    2023-07-06 11:45:40
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载