首页 > 解决方案 > 即使 server.tomcat.max-threads=5,Springboot 也会增加线程

问题描述

我现在有一个 springboot 应用程序,即使服务器空闲,线程也会不断增加。这会导致机器随着时间的推移而崩溃。导致非常高的内存和 CPU 使用率。

我尝试设置 server.tomcat.max-threads=5 但我很不幸,线程不断上升。

顺便说一下,这些是我的组件: - Rest 模板 - OK HTTP - Hikari CP - Springboot 和 Spring Framework(@RestController 和 @Service) - HttpInterceptor(请求和传出) - Hibernate / JPA

我还在计算使用 htop 和我创建的 JNI 的线程数。JNI PID/TID 可以获得 htop 的轻量级进程 ID。所以这个 JNI 可以虚拟地映射 LWPID 和 java 线程。

任何帮助都感激不尽。

谢谢,
阿塔尼斯泽拉图

标签: multithreadingspring-boottomcat

解决方案


我的问题现在解决了。
这些是我观察到的事情,也是问题的根本原因。

首先,我为我所做的每个查询创建了 Hikari 线程池和本地实体管理器工厂 Bean,这些查询在应用程序的生命周期中只应该执行一次,或者对于每个数据源连接都应该执行一次。这是线程不断产生的主要原因。Thread Pool/LocalEntityManagerFactoryBean 的创建与此代码片段有关:

HikariDataSource connectionPoolDatasource = new HikariDataSource(connectionPoolConfig);

localContainerEntityManagerFactoryBean.setDataSource(connectionPoolDatasource);
localContainerEntityManagerFactoryBean.setJpaProperties(jpaProperties);
localContainerEntityManagerFactoryBean.afterPropertiesSet();

参考:https
://groups.google.com/forum/#!topic/ hikari-cp/IsVEn-D6oFA 参见 Brett Wooldridge 对 Jen-Ming Chung 的回应。

最后,每次查询或连接到数据库时,我都没有调用 Connection.close() 。
这也导致线程没有被终止或关闭。
以及打开数据库连接。
参考:在纯 JPA 设置中获取数据库连接



干杯!


推荐阅读