写点什么

【YashanDB 数据库】yasdb jdbc 驱动集成 druid 连接池,业务 (java) 日志中有 token IDENTIFIER start 异常

作者:YashanDB
  • 2024-07-25
    广东
  • 本文字数:612 字

    阅读完需:约 2 分钟

问题现象

客户的 java 日志中有如下异常信息:


问题的风险及影响

对正常的业务流程无影响,但是影响 druid 的 merge sql 功能(此功能会将 sql 语句中的字面量替换为绑定变量,然后将替换以后的 sql 视为同一个,然后用做执行性能统计)

问题影响的版本

与 yashandb 版本无关

问题发生原因

druid 源码中在 merge sql 时会调用 ParameterizedOutputVisitorUtils.parameterize(sql, null, null, null, null);此方法的第二个参数为 dbType,此时传入为 null,解析时不识别递归查询中的 start 关键字,因而抛出异常。

解决方法及规避方式

由于此异常对正常的业务流程无影响,忽略此异常或者关闭 merge sql 功能即可(设置 spring.datasource.druid.filter.stat.mergeSql=false)

问题分析和处理过程

spring+druid 连接池初始化时,要指定 dbtype 属性(由参数 spring.datasource.druid.dbType 指定)。但是 druid 目前不支持 yashan,此参数的值又不能写成 oracle。如果写成 oracle,启动时会有如下异常:



所以,spring.datasource.druid.dbType 的值就要设置为空或者 YaShanDB。


无论设置为哪种,druid 在 merge sql 的时候,都会进入 dbType=null 的分支,此时 ParameterizedOutputVisitorUtils.parameterize 方法就会抛出 token IDENTIFIER start 异常。


而此方法在 dbType=oracle 的时候,可以正常解析,不会抛出异常。但是由于 druid 支持的原因,我们无法在 jvm 进程启动时通过配置达到如下效果。


经验总结

如下为一个可以直接运行的 springboot + druid + yashandb demo:


druid_test.zip

用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
【YashanDB数据库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常_yashandb_YashanDB_InfoQ写作社区