MysqlAnalyzeStatement not allow : analyze table

文章讲述了在使用Druid连接MySQL时遇到的AnalyzeStatement错误,原因是Druid未识别此SQL类型。解决方法是将analyze替换为optimizetable进行表优化。文章提醒调整noneBaseStatementAllow可能带来的风险,并指出这两个操作会锁表,对交易有影响。
摘要由CSDN通过智能技术生成

问题描述

druid:1.2.4
Mysql
maybits
mapper.xml:

<update id="analyzeXXX">
	analyze table _tablename_
</update>

执行报错MysqlAnalyzeStatement not allow : analyze table tablename

报错信息

在这里插入图片描述

问题原因

Debug了一下druid,不知道是不是druid的缺陷。
druid 能识别出Mysql的Analyze 语句,使用对应的 MySqlAnalyzeStatement 对象处理,但是在语句校验时com.alibaba.druid.wall.spi.WallVisitorUtils#preVisitCheck方法中却没有对MySqlAnalyzeStatement识别,导致进入如下else的逻辑中

else {
	allow = config.isNoneBaseStatementAllow();
	errorCode = ErrorCode.NONE_BASE_STATEMENT_NOT_ALLOW;
    denyMessage = x.getClass() + " not allow";
}

即 最后allow = false
使用druid连接oracle库没有问题

解决方案

将analyze table换成optimize table,能执行;
对于此次的需求,其实还是做表优化,analyze只是更新了统计信息

<update id="analyzeXXX">
	optimize table _tablename_
</update>

如果将noneBaseStatementAllow设置成true,影响太大,有风险,没这么改。
但是对于oracle,却 没有 对应的OracleAnalyzeStatement,所以,oracle执行Analyze没有问题。

optimize table和analyze table 都会锁表,表会只读,对交易有影响,也要谨慎使用。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值