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

Spring Boot与Hibernate中同一方法被重复调用的异常问题求助

排查Spring Boot+Hibernate方法重复执行的问题

我之前也碰到过类似的诡异情况,结合你给出的Tomcat日志和技术栈,咱们一步步拆解可能的原因和解决思路:

1. 先确认:是多请求触发,还是单请求内重复执行?

从日志里的线程名(nio-8009-exec-7、nio-8009-exec-10)来看,这是不同的HTTP请求线程,大概率是外部重复发起了请求,而不是同一个请求里方法被多次执行。不过保险起见,你可以在方法开头加一段日志,打印一个唯一的请求ID:

String requestId = UUID.randomUUID().toString();
log.error("Api Service Get Fattura By Commessa: 248, Request ID: {}", requestId);

如果每次日志的requestId都不一样,那肯定是多请求触发;如果相同,再排查单请求内的问题。

2. 多请求触发的常见原因&解决

前端/客户端重复提交

  • 可能性:用户多次点击按钮,或者前端AJAX请求没做防抖处理,网络波动导致请求重发。
  • 解决:
    • 前端给按钮加点击锁定(比如点击后禁用按钮,直到请求返回);
    • 给接口加幂等性校验:比如用Commessa的ID作为唯一标识,请求进来时先查Redis/数据库是否已经处理过这个请求,处理过就直接返回结果,不再执行业务逻辑。

反向代理/负载均衡的误触发

  • 可能性:如果你的服务部署在反向代理(比如Nginx)或负载均衡后面,可能对方把这个接口当成了健康检查地址,定期发起请求。
  • 解决:检查代理服务器的配置,确认健康检查的接口是不是你这个业务接口,改成专门的/health接口(Spring Boot Actuator自带)。

3. 单请求内重复执行的排查(如果requestId相同)

Hibernate懒加载导致的重复查询

  • 可能性:如果方法里用到了懒加载的关联实体,当接口返回JSON时,Jackson序列化会触发懒加载,导致Hibernate多次执行查询,看起来像是方法重复执行。
  • 解决:
    • 在JPQL/HQL里用fetch join提前加载关联对象,避免懒加载触发;
    • 用@JsonIgnore注解标记不需要序列化的懒加载属性;
    • 临时关闭当前线程的懒加载(不推荐,可能引发其他问题):Hibernate.initialize(entity)提前初始化。

Spring AOP或日志切面重复织入

  • 可能性:如果你用了AOP做日志或权限校验,可能切面配置不当,导致同一个方法被多次拦截,日志重复打印(看起来像方法重复执行)。
  • 解决:检查AOP的切点表达式,确认是否有重复匹配的情况,比如同时匹配了类和方法的切面。

事务传播行为问题

  • 可能性:如果方法被其他带@Transactional注解的方法调用,且调用方的事务传播属性是REQUIRES_NEW,可能导致方法在新事务里被多次执行。
  • 解决:检查方法上的@Transactional注解的propagation属性,确认是否有不必要的REQUIRES_NEW配置。

内容的提问来源于stack exchange,提问作者PaolaG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:44:52