环境主要配置:
Java8、springboot v2.7.8、mybatis3.5.9、mybatis-plus3.5.2、5.7.25-OceanBase-v3.2.3.1
数据库执行任何update后再执行任何insert都会异常。
如果执行delete,再insert就没问题。
即使不是同一张表也会有影响。
执行update后,大约10分钟后再save就没问题。
异常信息非常模糊:
###Cause: java.sql.SQLException: 0
; 0; nested exception is java.sql.SQLException: 0
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:110)
### Cause: java.sql.SQLException: 0
; 0; nested exception is java.sql.SQLException: 0
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:110)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
at com.sun.proxy.$Proxy154.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
at com.sun.proxy.$Proxy162.insert(Unknown Source)
at com.baomidou.mybatisplus.extension.service.IService.save(IService.java:63)
省略…
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
at com.mysql.cj.protocol.a.NativePacketPayload.readInteger(NativePacketPayload.java:398)
at com.mysql.cj.protocol.a.NativePacketPayload.readString(NativePacketPayload.java:605)
at com.mysql.cj.protocol.a.NativeServerSessionStateController$NativeServerSessionStateChanges.init(NativeServerSessionStateController.java:112)
at com.mysql.cj.protocol.a.result.OkPacket.parse(OkPacket.java:66)
at com.mysql.cj.protocol.a.NativeProtocol.readServerStatusForResultSets(NativeProtocol.java:1751)
at com.mysql.cj.protocol.a.TextResultsetReader.read(TextResultsetReader.java:116)
at com.mysql.cj.protocol.a.TextResultsetReader.read(TextResultsetReader.java:48)
at com.mysql.cj.protocol.a.NativeProtocol.read(NativeProtocol.java:1660)
at com.mysql.cj.protocol.a.NativeProtocol.readAllResults(NativeProtocol.java:1714)
at com.mysql.cj.protocol.a.NativeProtocol.sendQueryPacket(NativeProtocol.java:1064)
at com.mysql.cj.NativeSession.execSQL(NativeSession.java:665)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:893)
... 175 common frames omitted
怀疑过多数据源、mybatis-plus版本,最终发现都不是。
打断点跟了一下,莫名其妙就异常了,怀疑是跟数据库连接有关。
这里用的mysql连接器:
com.mysql
mysql-connector-j
8.0.32
数据库用的OceanBase-v3.2.3.1,MySQL 兼容模式,查看版本:
SELECT version();
------------------
5.7.25-OceanBase-v3.2.3.1
说明是5.X的MySQL,我们的连接器版本太高了。
换一个低版本的:
mysql
mysql-connector-java
5.1.46
要注意groupId、artifactId都不一样了。
从 8.0.31 开始时更名。
https://mvnrepository.com/artifact/mysql/mysql-connector-java
https://mvnrepository.com/artifact/com.mysql/mysql-connector-j
https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/
https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.31/
如上所说,把MySQL连接器降级即可。
如果你在某些配置文件里指定了:driver-class-name = com.mysql.cj.jdbc.Driver
那么记得改成:driver-class-name = com.mysql.jdbc.Driver
Driver有什么区别?
直达查看