【YashanDB 数据库】yasdb jdbc 驱动集成 druid 连接池,业务 (java) 日志中有 token IDENTIFIER start 异常
问题现象
客户的 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:
评论