multithreading - 即使 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 线程。
任何帮助都感激不尽。
谢谢,
阿塔尼斯泽拉图
解决方案
我的问题现在解决了。
这些是我观察到的事情,也是问题的根本原因。
首先,我为我所做的每个查询创建了 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 设置中获取数据库连接
干杯!
推荐阅读
- java - 为什么我的加法应用给出了错误的答案?
- vue.js - 如何将不同文件中的 ipcMain.on() 函数与 main.js 分开
- html - GatbysJS 排版 - AvenirNext - 不适用于 Windows / Linux
- android - INFO 暂时找不到测试类 SampleTest 正在跳过
- python - 如何修复 Heroku 上的 ImportError "_psutil_linux"
- angular - 无法获得 Textarea 的高度
- azure-active-directory - 为多个应用程序/环境配置 adal.js
- ruby - selenium/webdriver/firefox/binary.rb:134:in `path': 无法修改冻结字符串 (FrozenError)
- vue.js - Vue Slider Component - 同时启用拖尾和点击更新
- c# - 在 dotnet-core 控制台应用程序和常规 winforms 应用程序之间进行通信的最佳方式