Java8迁移至Java17后Spring Boot调用saveAll遇JDBC异常求助
Java 17迁移后Spring JPA saveAll()触发JDBC异常的解决思路
将Spring Boot应用从Java 8迁移至Java 17后,调用Spring JPA的saveAll(entityList)方法时频繁触发JDBC相关异常,以下是异常日志、配置信息及版本信息,对应的解决思路如下:
异常日志
2023-02-09 13:22:00,598 ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper [pool-180-thread-1] Index 0 out of bounds for length 0 2023-02-09 13:22:00,604 ERROR org.springframework.orm.jpa.EntityManagerFactoryUtils [pool-180-thread-1] Failed to release JPA EntityManager org.hibernate.exception.GenericJDBCException: Unable to release JDBC Connection at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:223) at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.close(LogicalConnectionManagedImpl.java:261) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:175) at org.hibernate.internal.AbstractSharedSessionContract.close(AbstractSharedSessionContract.java:374) at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:413) at org.hibernate.internal.SessionImpl.close(SessionImpl.java:398) at org.springframework.orm.jpa.EntityManagerFactoryUtils.closeEntityManager(EntityManagerFactoryUtils.java:427) at org.springframework.orm.jpa.JpaTransactionManager.doCleanupAfterCompletion(JpaTransactionManager.java:650) at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:992) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:790) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:654) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:407) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.sql.SQLException: Index 0 out of bounds for length 0 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) at com.mysql.cj.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:2042) at com.zaxxer.hikari.pool.PoolBase.resetConnectionState(PoolBase.java:219) at com.zaxxer.hikari.pool.PoolEntry.resetConnectionState(PoolEntry.java:107) at com.zaxxer.hikari.pool.ProxyConnection.close(ProxyConnection.java:263) at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.closeConnection(DatasourceConnectionProviderImpl.java:127) at org.hibernate.internal.NonContextualJdbcConnectionAccess.releaseConnection(NonContextualJdbcConnectionAccess.java:49) at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.releaseConnection(LogicalConnectionManagedImpl.java:219) ... 38 common frames omitted Caused by: com.mysql.cj.exceptions.CJException: Index 0 out of bounds for length 0 at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:124) at com.mysql.cj.NativeSession.execSQL(NativeSession.java:699) at com.mysql.cj.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:2033) ... 44 common frames omitted Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 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:1755) 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:1664) at com.mysql.cj.protocol.a.NativeProtocol.readAllResults(NativeProtocol.java:1718) at com.mysql.cj.protocol.a.NativeProtocol.sendQueryPacket(NativeProtocol.java:1064) at com.mysql.cj.protocol.a.NativeProtocol.sendQueryString(NativeProtocol.java:997) at com.mysql.cj.NativeSession.execSQL(NativeSession.java:663) ... 45 common frames omitted
Spring JPA配置
spring.datasource.url=jdbc:mysql://localhost:3306/mock?autoReconnect=true&rewriteBatchedStatements=true&profileSQL=false&allowMultiQueries=true spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.dialect =org.hibernate.dialect.MySQL5Dialect spring.jpa.show-sql=false spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.jdbc.batch_size=300 spring.jpa.properties.hibernate.order_inserts=true spring.jpa.properties.hibernate.order_updates=true spring.jpa.properties.hibernate.jdbc.batch_versioned_data =true spring.jpa.properties.hibernate.jdbc.time_zone =UTC spring.jpa.properties.hibernate.id.new_generator_mappings=false
Spring Boot版本
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.10</version> </parent>
解决思路
- 升级MySQL JDBC驱动版本:异常栈显示问题出在MySQL驱动的数据包解析逻辑,旧版本驱动与Java 17存在兼容性问题。Spring Boot 2.6.10默认的mysql-connector-java版本较低,建议升级至8.0.30及以上版本,该版本修复了多个Java 17相关的兼容性Bug。
- 更新Hibernate方言:当前使用的
MySQL5Dialect适配MySQL 5.x,若你的MySQL服务器是8.x版本,替换为org.hibernate.dialect.MySQL8Dialect,避免方言不匹配导致的JDBC交互异常。 - 调整连接池配置:添加
spring.datasource.hikari.connection-test-query=SELECT 1,确保连接归还池时进行有效性检查,避免使用已失效的连接;同时移除autoReconnect=true,该属性在高版本驱动中已不推荐,且可能与HikariCP的连接管理逻辑冲突。 - 验证批量插入配置:确认
rewriteBatchedStatements=true与Hibernate批量插入配置(hibernate.jdbc.batch_size)兼容,过高的批量大小可能导致数据包异常,可适当调小batch_size测试。
内容的提问来源于stack exchange,提问作者Gokulkrishnan
相关产品推荐
相关产品推荐

