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

Spring/Hibernate使用ScrollableResults时连接泄漏问题排查求助

生产环境连接泄漏问题排查

问题背景

正在排查生产环境中的连接泄漏问题,该问题关联QueryDSL的Issue#3089。QueryDSL库作者怀疑Hibernate是问题根源,我已通过最小示例复现该问题。在向Hibernate提交Issue前,希望确认此问题是否由自身代码或Spring框架导致。

使用版本

  • Spring-Boot 3.0.5(旧版本同样受影响)
  • Hibernate 6.1.7 FINAL(旧版本同样受影响)

复现代码

调用以下Controller接口会引发连接泄漏,Hikari连接池已检测到该问题并输出日志:

@Controller
public class IndexController {
    @PersistenceContext
    private EntityManager entityManager;

    @GetMapping("/test")
    public ResponseEntity<Map<Long, String>> fetchEntities() {
        Query query = entityManager.createQuery("select testEntity.id, testEntity.name from TestEntity testEntity");
        org.hibernate.query.Query<?> unwrappedQuery = query.unwrap(org.hibernate.query.Query.class);
        try (ScrollableResults<?> results = unwrappedQuery.scroll()) {
            while (results.next()) {}
        }
        return ResponseEntity.noContent().build();
    }
}

即使手动调用entityManager.close()和/或results.close(),连接仍会泄漏。

对应的实体类

@Entity
@Table(name = "test")
public class TestEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String name;

    public TestEntity() {
    }

    public TestEntity(String name) {
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

数据库配置类

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackageClasses = { DatabaseConfig.class })
@EntityScan(basePackageClasses = { DatabaseConfig.class })
public class DatabaseConfig {
}

应用配置

management:
  server:
    base-path: /actuator
    port: 8081
  endpoints.web.exposure.include: '*'

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: 
    password:
    hikari:
      leak-detection-threshold: 2000
  jpa:
    open-in-view: false
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect

logging:
  level:
    com.zaxxer.hikari.pool.HikariPool: debug

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:02:33