我使用spring 2作为API,托管在aws ecs fargate上。数据库在RDS上为10.6级,16 gb内存,4 cpu。
我的hikari配置如下:
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1
spring.datasource.hikari.maximum-pool-size=100
spring.datasource.hikari.minimum-idle=80
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=500000
spring.datasource.hikari.max-lifetime=1800000一般情况下这是完美的..。但是当负载出现在服务器上时,比如说大约5000并发API请求.(这也不是很大.),我的应用程序会崩溃。启用了hikari的调试日志。因此,获取以下信息:
hikaripool-1 - pool stats (total=100 active=100 idle=0 waiting=100)异常消息显示连接不可用:
HikariPool-1 - Connection is not available, request timed out after 30000ms.
org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC同时,当我看到RDS提高了性能时,最大查询执行时间也是< 0.03 second..And CPU利用率也低于50%。所以数据库服务器没有问题。
我只使用实体和JPA。不通过手动打开连接来使用任何查询。因此,关闭连接或连接泄漏可能不是问题。但在启用泄漏检测之后:
spring.datasource.hikari.leakDetectionThreshold=2000在日志中获取警告,显示明显的连接泄漏检测到:当我检查指向此错误的方法时:那么它只是JPA findById()方法。
那么,什么应该是连接不可用的根本原因,并且只为10k api请求请求超时。有100个游泳池大小..。为什么在活动连接转到100,等待是100之后,它不释放任何连接?我的ECS应用服务器在此错误下自动重新启动,并仅在5-7分钟后才可访问。
发布于 2020-07-16 09:04:25
在测试时,HikariCP建议在出现尖峰需求时删除minimumIdle
为了最大限度地提高性能和响应尖峰需求,我们建议不要设置此值,而是允许HikariCP充当固定大小的连接。
如果你把它移除。同时,空闲超时也是无关的。
发布于 2022-08-17 09:21:25
由于配置中的连接池大小错误,您的应用程序可能会将其限制为超时。池的大小是100的10倍,这将影响性能和稳定性。
HikariCP池大小公式可以在它们的维基中找到,但看起来如下所示:
((core_count * 2) + effective_spindle_count)。核心计数不应包括HT线程,即使启用了超线程。
如果您有4个核心,那么您的连接池大小可以保持在默认大小为10。
发布于 2022-11-20 21:09:11
如果这可能有帮助的话,我最近正面临着这个问题,这给了我一段艰难的时光。
服务器接受太多hikari池无法处理的请求,因此hikari试图获得额外的连接以满足需求的激增。
例如:对于带有200个默认线程的tomcat,如果您的maxPoolSize = 10,在峰值请求时,您的服务器将尝试同时服务200个线程。如果池中的连接繁忙,hikari将尝试获得190个连接,这就是您在等待中看到的。
我就是这样管理它的。
我确保tomcat线程不会超过hikari maxPoolSize的数量。这样,就不需要在高峰期间要求更多的联系了。
在spring引导中,这是我使用的配置。
server.tomcat.threads.max = 50
spring.datasource.hikari.maximumPoolSize = 50注意: 50是根据您的服务器容量而变化的。
https://stackoverflow.com/questions/62930825
复制相似问题