我在 Springboot 中有一个使用 Hikari 进行连接池的休息 API。Hikari 与默认配置一起使用(池中有 10 个连接,等待连接超时 30 秒)。API 本身非常简单
- 它首先进行 JPA 存储库查询以从 PostgresDB 获取一些数据。这部分大约需要 15-20 毫秒。
- 然后,它将这些数据发送到速度较慢且可能需要 120 秒以上的远程 REST API。
- 一旦远程 API 响应,我的 API 会将结果返回给客户端。简化版本如下所示。
public ResponseEntity analyseData(int companyId) {
Company company = companyRepository.findById(companyId);//takes 20ms
Analysis analysis = callRemoteRestAPI(company.data) //takes 120seconds
return ResponseEntity.status(200).body(analysis);
}
该代码没有任何 @Transactional 注释。我发现 JDBC 连接在我的 API 的整个持续时间内(即约 120 秒)都保持不变。因此,如果我们收到超过 10 个请求,它们会超时等待 hikari 连接池(30 秒)。但严格来说,我的 API 在 JPA 查询完成后不需要连接(上面的第 1 步)。
有没有办法让 spring 在查询后立即释放这个连接,而不是一直保持到整个 API 完成处理?可以将 Spring 配置为为每个 JPA 请求获取连接吗?这样,如果我有多个 JPA 查询,其中散布着非常慢的操作,则服务器吞吐量不会受到影响,并且它可以处理超过 10 个并发 API 请求。.