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
根据您提供的信息,您遇到了一个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的开发团队报告此问题以获取进一步的支持和帮助。
心跳检测语句可能不会被记录在数据库的SQL日志中,因为它们通常是由连接池自动发送的,而不是由应用程序直接发送的。如果你需要确认心跳检测语句是否正常工作,可以查看连接池的配置文件或者文档,了解具体的心跳检测设置和机制。
另外,如果你使用的是JDBC连接,你需要在应用程序中显式地发送心跳检测语句,以确保连接的有效性。在这种情况下,你可以在应用程序中编写相应的代码,定时发送心跳检测语句,并将其记录在SQL日志中,以便跟踪和调试。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。