• SQLException Table definition has changed, please retry transaction


      近日,一开发说只要切换到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的原因,后面有空看下。

  • 相关阅读:
    Flask Mysql数据库连接
    Flask form前后端交互消息闪现
    Flask block继承和include包含
    Flask filter过滤器
    常规http状态码
    linux搭建hadoop环境
    inline-block布局代码
    JDBC4.0自动加载驱动器类
    用反射模拟Hibernate保存JavaBean
    深入ThreadLocal的内部机制
  • 原文地址:https://www.cnblogs.com/zhjh256/p/12115338.html
Copyright © 2020-2023  润新知