Spring Boot多次调用Service触发StackOverflowError问题求助
解决方案:多次调用@Transactional服务方法导致Hibernate警告与StackOverflowError
可能原因
类级别标注@Transactional会让所有服务方法都被事务代理包裹,即使不需要事务的方法(比如simple())也会触发事务上下文的处理。在Spring Boot 2.2.4的旧版本中,这种全局事务代理可能和Hibernate的Session/ResultSet管理产生冲突,导致资源未正确释放,最终引发栈溢出。
解决步骤
1. 缩小事务范围,仅给需要事务的方法添加@Transactional
移除类级别的@Transactional,只在实际需要事务的方法上标注:
@Service @Qualifier("purchaseService") public class PurchaseServiceImpl implements PurchaseService { private OrderRepository orderRepository; @Autowired public PurchaseServiceImpl(OrderRepository orderRepository) { this.orderRepository = orderRepository; } @Override @Transactional // 仅在此方法添加事务 public Order createOrder() { ... return new Order(); } public String simple(){ return "simple called !"; } ... }
2. 显式指定事务传播行为(可选)
如果必须保留类级别的事务,可给类指定默认传播行为为SUPPORTS,让不需要事务的方法仅在已有事务时才加入,同时给需要事务的方法强制指定REQUIRED:
@Service @Transactional(propagation = Propagation.SUPPORTS) @Qualifier("purchaseService") public class PurchaseServiceImpl implements PurchaseService { // ... @Override @Transactional(propagation = Propagation.REQUIRED) // 强制开启事务 public Order createOrder() { ... } public String simple(){ return "simple called !"; } }
3. 升级Spring Boot版本
Spring Boot 2.2.4属于较旧版本,存在一些已知的事务与Hibernate交互的bug。建议升级到2.2.x分支的最新稳定版(如2.2.13.RELEASE),或直接升级到更高的稳定分支(如2.7.x),以修复底层框架问题。
4. 验证数据库连接池配置
检查application.properties或application.yml中的HikariCP连接池配置,确保连接释放规则正确:
# 示例配置,根据实际场景调整 spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.idle-timeout=600000 spring.datasource.hikari.max-lifetime=1800000
验证
修改后重新启动应用,多次调用接口测试,观察控制台是否还出现Hibernate警告及栈溢出异常。
内容的提问来源于stack exchange,提问作者Software Developer
相关产品推荐
相关产品推荐

