druid报错com.alibaba.druid.sql.parser.ParserException: TODO. pos 97, line 4, column 43, token INTERVAL

遇到Druid解析错误'ParserException: TODO. pos 97, line 4, column 43, token INTERVAL'。通过调试源码未发现明显问题。解决方案在于关闭StatFilter的mergeSql功能,参考Druid官方文档,关闭监控统计可以避免此错误。在SpringBoot配置中,将connectionProperties的'druid.stat.mergeSql=true'改为'druid.stat.mergeSql=false'。" 112294980,10295480,SOLIDWORKS转DWG字体乱码解决与图层映射设置,"['3D设计', 'CAD软件', 'SOLIDWORKS', 'AutoCAD', '文件转换']

com.alibaba.druid.sql.parser.ParserException: TODO. pos 97, line 4, column 43, token INTERVAL

debug源码半天,也没有看出来到底怎么回事,最后找到类似问题

看报错是 Duird 的 StatFilter - merge sql 时出错了,可以在配置里把 statFilter 的 mergeSql 功能关掉, 参考官方文档:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

Druid内置提供一个StatFilter,用于统计监控信息。(durid 会提供一个监控界面,这个StatFilter 会提供监控界面的统计数据,开启关闭对本身程序不会影响) 

springboot 开启监控界面 配置

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      useGlobalDataSourceStat: true
      # 开启了  druid 监控界面
      stat-view-servlet:
        enable
在使用阿里巴巴Druid解析SQL时,若遇到`com.alibaba.druid.sql.parser.ParserException: not supported`异常,通常与SQL语句中使用了Druid不支持的语法、关键字或特定数据库方言有关。根据提供的引用信息,异常信息中包含的位置信息(如pos 915, line 37)可以帮助定位具体的语法问题所在[^1]。 ### 常见原因及解决方案 #### 1. **SQL中使用了Druid不支持的关键字或语法** DruidSQL解析器对某些数据库专有语法(如MySQL的`INTERVAL`关键字、特定函数或操作符)可能不完全支持。例如,在引用[1]中提到的`token INTERVAL`表明SQL中使用了`INTERVAL`关键字,而Druid未能正确解析。 **解决方案:** - 检查SQL语句中是否使用了特定数据库的关键字或函数。 - 如果使用了`INTERVAL`等关键字,尝试将其替换为标准SQL语法或数据库兼容的表达方式。 - 可以考虑升级Druid版本,新版本可能已支持相关语法。 #### 2. **MyBatis动态SQL解析问题** 在引用[2]中提到的`token AND`错误,是由于MyBatis动态SQL中`<if>`标签内的条件判断导致Druid解析失败。当某些参数为空时,生成的SQL可能不完整或格式不正确,进而导致Druid抛出解析异常。 **解决方案:** - 确保MyBatis动态SQL在参数为空时不会生成非法SQL片段。 - 使用`<choose>`标签替代多个`<if>`标签,确保生成的SQL逻辑清晰且完整。 - 对于`IN`子句,确保集合参数不为空,避免生成无效的`IN ()`结构。 #### 3. **Druid版本问题** 某些Druid版本可能存在解析器缺陷,导致无法正确识别某些SQL结构。 **解决方案:** - 升级至最新稳定版本的Druid,以修复可能存在的解析器问题。 - 检查Druid的GitHub Issues或社区讨论,确认是否已有类似问题的报告及修复方案。 #### 4. **SQL监控与合并配置问题** 在Spring Boot项目中,若启用了DruidSQL监控功能并配置了`druid.stat.mergeSql=true`,Druid会尝试合并和解析SQL语句,可能导致某些复杂SQL解析失败。 **解决方案:** - 如果不需要SQL合并功能,可以关闭该配置项: ```yaml spring: datasource: druid: connectionProperties: druid.stat.mergeSql=false ``` - 如果需要保留该功能,确保SQL语句结构简单、语法标准,避免使用复杂或数据库专有的语法。 #### 5. **使用DruidSQL格式化工具进行调试** Druid提供了SQL格式化和解析工具,可以用于调试SQL语句是否符合其解析规范。 **示例代码:** ```java import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.parser.SQLParserUtils; import com.alibaba.druid.sql.parser.SQLStatementParser; import java.util.List; public class SqlParserTest { public static void main(String[] args) { String dbType = "mysql"; // 数据库类型 String sql = "SELECT * FROM table WHERE create_time > NOW() - INTERVAL 1 DAY"; // 待解析SQL try { List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType); for (SQLStatement stmt : stmtList) { System.out.println(stmt.toString()); } } catch (Exception e) { System.err.println("SQL解析失败:" + e.getMessage()); } } } ``` 通过上述方法,可以更直观地发现SQL语句中导致Druid解析失败的具体位置和原因。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

励志重写JDK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值