近日,一开发说只要切换到mysql,执行到某一条查询就会发生SQLException Table definition has changed, please retry transaction,oracle就不会。换成另外一个mapper也不会有问题。同时select * from innodb_trx可以看出连接未释放(至于连接未释放,是因为commit的时候没有指定参数true,这依赖于mysql的默认行为)。经查,之所以出现该错,是因为mapper默认使用REUSE执行器,它导致了语句缓存,中间执行了truncate某个分区(另外一个连接的),但是原先的mapper未失效,故发生该问题。因为mysql 5.0.5以后的版本默认useServerPrepStmts=false。一般OLTP建议useServerPrepStmts=true&cachePrepStmts=true。

  解决方法:SqlSession重新getMapper(因为为了效率,我们mybatis配置默认的执行器为REUSE),即不会出现该问题。

  为什么oracle没有这个问题呢,LZ还未细查该环境,概率是因为没有使用server端的PreparedStatement的原因,后面有空看下。

花若盛开,蝶自飞来,你若精彩,幸福开怀!2020年12月11日-18日