[已解决]数据库执行任何update后再执行任何insert都会异常

项目场景:

环境主要配置:
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连接器:

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.0.32</version>
</dependency>

数据库用的OceanBase-v3.2.3.1,MySQL 兼容模式,查看版本:

SELECT version();
------------------
5.7.25-OceanBase-v3.2.3.1

说明是5.X的MySQL,我们的连接器版本太高了。
换一个低版本的:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>

要注意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有什么区别?
👉直达查看

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值