近日,一开发说只要切换到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,其测试可见https://blog.csdn.net/alex_xfboy/article/details/83901351。
解决方法:SqlSession重新getMapper(因为为了效率,我们mybatis配置默认的执行器为REUSE),即不会出现该问题。
为什么oracle没有这个问题呢,LZ还未细查该环境,概率是因为没有使用server端的PreparedStatement的原因,后面有空看下。