我有基于 spring security/spring boot 和 postgresql 数据库构建的用户身份验证微服务。当我以每秒 1000 个请求开始性能测试时,我发现服务的响应时间长达 16 秒,这绝对是不可接受的。我做了分析,发现大部分时间都被
ConcurrentBag#borrow
和 TransactionAspectSupport#invokeWithinTransaction
方法消耗了。知道如何解决这个问题。它托管在 heroku 上。我已将微服务实例增加到 2 个,还增加了数据库 cpu、内存和磁盘,但这没有帮助。
spring boot版本是3.2.3
我只是瞪大了眼睛
ConcurrentBag borrow
,第一个点击是https://javadoc.io/doc/com.zaxxer/HikariCP/2.4.3/com/zaxxer/hikari/util/ConcurrentBag.html
如果这确实是我们所说的
ConcurrentBag
,那么您的连接池似乎已超载,并且请求正在等待获取连接。
这就是 @M.Deinum 在他的评论中提到的。
有多种方法可以解决这个问题。 哪一种是正确的很大程度上取决于您的环境。
您启用了 spring.jpa.open-in-view 吗?你可以尝试禁用它。启用后,整个请求的 dbconnection 将从池中取出。