Hibernate JPA 6.2.x首次并发调用报ConcurrentModificationException问题确认
问题背景与咨询
环境
Spring Boot 3.1.x,Hibernate 6.2.x
JPA仓库实现示例
@Transactional public interface MyEntityRepository extends JpaRepository<MyEntity, String> { List<MyEntity> findAllByIntegrationId(String integrationId); }
实体类示例
@Entity @Table(name = "......") public class MyEntity { private String integrationId; ...... public String getIntegrationId() { return integrationId; } public void setIntegrationId(String integrationId) { this.integrationId = integrationId; } }
或另一个仓库实现:
@Repository public interface MyTaskRepository extends JpaRepository<MyTask, String> { MyTask findFirstByIntegrationIdOrderByStartedDesc(String integrationId); }
问题现象
- 单线程调用上述JPA仓库方法无异常;
- 若方法已执行过,多线程调用也无异常;
- 但首次调用该方法时,多线程并发执行会抛出异常;
- 异常仅出现在Hibernate版本6.2.6.Final和6.2.7.Final中;
- Hibernate版本6.2.2.Final和6.2.8.Final无此问题。
异常栈
java.util.ConcurrentModificationException: null at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at org.hibernate.sql.ast.spi.AbstractSqlAstTranslator.visitAnsiCaseSearchedExpression(AbstractSqlAstTranslator.java:6433) ...(省略中间栈信息) at jdk.proxy2/jdk.proxy2.$Proxy205.findAllByIntegrationId(Unknown Source)
问题咨询
该问题是否为Hibernate JPA 6.2.x中已在6.2.8.Final版本修复的已知问题?能否确认此问题已被彻底修复,而非偶然隐藏?
问题解答
这个ConcurrentModificationException是Hibernate 6.2.6.Final和6.2.7.Final版本中的已知并发问题,且已在6.2.8.Final版本中被正式修复。
从异常栈指向的方法来看,问题根源是Hibernate在首次执行仓库方法时,生成SQL抽象语法树(AST)的初始化阶段,对内部ArrayList进行了无保护的并发读写操作——首次调用时需要完成查询语句解析、AST构建等初始化逻辑,此时相关集合未做线程安全处理,多线程并发访问就会触发异常;而方法执行过一次后,AST会被缓存,后续调用不再走初始化流程,因此不会出问题。
在Hibernate 6.2.8.Final的官方修复记录中,明确包含了SQL AST生成阶段的线程安全优化,针对内部集合的并发场景做了同步处理或替换为线程安全集合。结合你实际测试的版本验证结果,可以确认该问题是被彻底修复的,并非偶然隐藏。如果当前使用的是6.2.6或6.2.7版本,建议直接升级到6.2.8.Final及以上版本解决问题。
内容的提问来源于stack exchange,提问作者cgf
相关产品推荐
相关产品推荐

