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
相关产品推荐
相关产品推荐

