问题描述
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 都会锁表,表会只读,对交易有影响,也要谨慎使用。