即使server.tomcat.max threads=5,Springboot也会增加线程



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

我试着设置server.tomcat.max线程数=5,但我很不走运,线程数一直在上升。

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

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

任何帮助都将不胜感激。

谢谢,
Artanis Zeratul

所以我敢打赌tomcat只有5个线程,而服务器中的一些其他技术正在创建这些额外的线程。现在tomcat采用了一种线程命名方案。通常,这5个线程的名称如下:

http-bio-8080-exec-1
http-bio-8080-exec-2
http-bio-8080-exec-3
...

你明白了。因此,如果你列出虚拟机中线程的名称(windows上的ctrl分页,linux上的kill-3 JAVA_PID,jconsole-可能是你的最佳选择。你应该只看到1-5的线程命名模式。所有其他线程都将由其他线程拥有。Tomcat在exec线程之外确实有额外的线程,但它们是固定数量的(停止线程、main等(。

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

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

HikariDataSource connectionPoolDatasource = new HikariDataSource(connectionPoolConfig);
localContainerEntityManagerFactoryBean.setDataSource(connectionPoolDatasource);
localContainerEntityManagerFactoryBean.setJpaProperties(jpaProperties);
localContainerEntityManagerFactoryBean.afterPropertiesSet();

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

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



干杯!