【问题分类】数据库驱动 / 框架兼容
【关键词】YashanDB JDBC、Druid连接池、mergeSql、ParameterizedOutputVisitorUtils、token IDENTIFIER start
一、问题现象
在使用 Spring Boot + Druid + YashanDB JDBC 驱动组合的项目中,部分用户在 Java 日志中观察到如下异常信息:
token IDENTIFIER start
虽然业务逻辑运行未受影响,但异常日志持续出现,引发了运维与开发团队的关注。
二、影响范围与风险分析
对实际业务流程无任何影响;
唯一影响:Druid 的 mergeSql 功能异常失效,不能正常合并 SQL 执行统计;
适用版本:与 YashanDB 驱动版本无关。
三、问题根因分析
Druid 在进行 SQL merge 时,会调用以下方法:
ParameterizedOutputVisitorUtils.parameterize(sql, null, null, null, null);
此处关键参数 dbType = null,意味着 Druid 无法识别该 SQL 的方言类型。
当 SQL 中含有 YashanDB 支持的递归查询语法如 start with ... connect by 时,Druid 无法正确解析其中的 start 关键字,最终抛出:
`
token IDENTIFIER start`
这类异常出现在 mergeSql 逻辑内部,并不影响 SQL 执行本身。
四、为什么不能设置 dbType=oracle?
Spring + Druid 默认在配置文件中可以设置:
spring.datasource.druid.dbType=oracle
但在集成 YashanDB JDBC 驱动时,druid 会在初始化阶段对 dbType 值进行校验,而目前并不识别 YaShanDB 为有效数据库类型。
若配置为 oracle:Druid 会因识别不出 YashanDB JDBC 驱动而启动失败;
若配置为 yashandb:无法被识别,默认仍处理为 null;
最终结果:mergeSql 会因 dbType=null 进入异常处理分支。
五、解决方案与规避建议
方案一:忽略异常(推荐)
由于该异常不影响业务执行,可在日志策略中进行屏蔽,或在文档中说明为可接受的预期现象。
方案二:关闭 Druid 的 mergeSql 功能
在配置文件中添加:
spring.datasource.druid.filter.stat.mergeSql=false
关闭 SQL merge 能力后,Druid 不再进行语法参数化处理,也就不会触发异常。
六、实践建议与经验补充
推荐配置组合
spring.datasource.druid.dbType=
spring.datasource.druid.filter.stat.mergeSql=false
这样既避免了 dbType 校验错误,也绕开了 mergeSql 中的语法解析异常。
Demo参考
官方建议参考 springboot + druid + yashandb 的 DEMO 工程进行配置验证。
七、总结
Druid 中的 mergeSql 功能依赖对 SQL 方言的正确识别;
当前版本尚未支持 YashanDB,因此在含有递归语法时解析失败属于预期行为;
可通过关闭 mergeSql 功能规避,或忽略该异常日志;
若未来 Druid 增加对 YashanDB 的 dbType 支持,问题将从根源解决。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。