近日,一開發說只要切換到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的原因,后面有空看下。
