繁体   English   中英

如何一次限制所有并发方法的线程数

[英]How to limit number of threads all concurrent methods at once

我正在处理一个遗留项目,它使用 Java 8、Spring、HikariCP 和 MySQL。微服务的方法由 Kafka 主题触发并开始报告操作。 几乎所有触发的方法都有这个,其中一些在它们的块中有相同的用法。

new ForkJoinPool().submit(() -> { users.parallelStream().forEach(user ->

该应用程序创建 8-9k 线程,所有线程都尝试获取或创建记录。 然而,数据库无法处理这些请求并开始抛出异常,Zabbix 发送了关于堆 memory 使用率超过 %90 的邮件:

原因:java.sql.SQLTransientConnectionException:HikariPool-2 - 连接不可用,请求在 30000 毫秒后超时。

当我检查数据库并看到 max_connections = 600 的变量时,但这还不够。

我想为应用程序级别设置线程数限制。 我尝试设置这些参数,但线程大小并没有减少。

SPRING_TASK_EXECUTION_POOL_QUEUE-CAPACITY,SPRING_TASK_EXECUTION_POOL_MAX-SIZE,-Djava.util.concurrent.ForkJoinPool.common.parallelism

有什么财产可以解决这个问题吗?

我已将所有new ForkJoinPool() to ForkJoinPool.commonPool()并使用此参数来控制线程创建-Djava.util.concurrent.ForkJoinPool.common.parallelism之后我解决了我的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM