Java 17 ForkJoinPool线程数超限致DB连接耗尽问题咨询
Java 17下ForkJoinPool线程膨胀引发的数据库连接超限问题
问题现象
Java 17环境中,ForkJoinPool会创建远多于Java 8的线程(这些线程并非并发执行),但每个线程都会建立数据库连接,最终超出数据库客户端的最大并发会话限制。
代码场景
示例代码存在递归调用.parallel()的逻辑:
A.fetchAll()→.parallel()→A.fetch()→B.fetchAll()→.parallel().parallel()默认使用forkJoinPool.commonPool(),其并行度由机器核心数或java.util.concurrent.ForkJoinPool.common.parallelism参数控制。
版本差异对比
- Java 8:仅8个线程并发执行,池大小固定为8
- Java 17:即便将并行度设为8,池大小仍会增至150
已尝试的无效方案
- 用固定核心线程数的
ExecutorService替代ForkJoinPool:高并发请求下会出现死锁,而死锁避免正是ForkJoinPool的核心优势之一 - 用自定义ForkJoinPool限制线程数:达到线程数限制时会抛出
java.util.concurrent.RejectedExecutionException: Thread limit exceeded replacing blocked worker异常
核心需求
使用无限队列,但严格限制线程池中的线程数不增长
关联背景
此问题关联OpenJDK的JDK-8299768问题
内容的提问来源于stack exchange,提问作者best wishes
相关产品推荐
相关产品推荐

