You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:55:16