写点什么

YashanDB 知识库|集成 Druid 连接池时日志报 “token IDENTIFIER start”? 问题虽小但有来头!

作者:数据库砖家
  • 2025-04-22
    广东
  • 本文字数:1048 字

    阅读完需:约 3 分钟

【问题分类】数据库驱动 / 框架兼容

【关键词】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 支持,问题将从根源解决。

用户头像

还未添加个人签名 2025-04-09 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB知识库|集成 Druid 连接池时日志报 “token IDENTIFIER start”?问题虽小但有来头!_数据库·_数据库砖家_InfoQ写作社区