近期将旧项目中的c3p0连接池替换为Druid后,部分原本正常的SQL语句执行时出现异常情况。
1、 若发现异常情况
2、 如果SQL在PL/SQL中执行正常,但程序中出现问题,需考虑是否是Druid防火墙拦截了SQL语句。若已配置相关过滤器,可尝试关闭防火墙进行测试。具体操作为修改配置文件中的filters属性,将其中的wall部分移除,即把中的wall删除,然后重新运行程序验证问题是否解决。
3、 若已配置监控防火墙,两者将协同工作,需对防火墙进行相应设置以确保正常运行。
4、 第一种方式是通过设置 property name=throwException value=true,使系统在检测到疑似攻击或无法解析的SQL语句时抛出异常。若将该值设为false,则不会抛出异常,SQL语句仍可正常执行,但相关错误信息将以日志形式记录,便于排查问题,同时避免程序因异常中断,提升系统稳定性与容错能力。
5、 第二种方法:若你遇到的问题与我相同,可能是由于Druid在解析SQL时出现失败。目前Druid对SQL语法的支持尚未覆盖全部语法规则,因此在某些复杂或特殊语法下可能出现解析异常。针对此类情况,可尝试关闭Druid的严格语法校验功能,通过设置``来实现。关闭后,Druid将不再对SQL语句进行严格的语法检查,从而避免因解析错误导致的异常,提升兼容性,适用于那些语法正确但不被Druid完全支持的SQL语句执行场景。
6、 该属性的详细说明如下
7、 初始引入WallFilter时,可将logViolation设为true,throwException设为false,这样既能记录违规行为,及时发现问题,又不会中断正常业务流程,便于在不影响系统运行的前提下逐步排查和优化安全策略。
8、 暂时屏蔽错误或高风险语法校验仅作临时处理,不建议直接上线。应优先修正SQL写法,确保规范安全。若确认无误,可联系Druid开发团队,提交SQL以供评估与指导。
