我在 Spring Boot 应用程序中遇到 HikariCP 问题。我不断看到警告消息:
“检测到明显的连接泄漏。”
数据库连接保持打开状态的时间似乎超出了必要的时间。经过一番调查,我意识到这个问题可能与 Spring 的 Open-Session-In-View (OSIV) 模式有关。不幸的是,由于当前的设置和时间限制,禁用 OSIV 对我们来说并不是一个快速的选择。
以下是出现问题的方法的简化示例:
public void example(String id) throws IOException, InterruptedException {
ExampleDto example = exampleService.fetchExample(id);
// The connection should ideally be returned to the pool here,
// but it remains open until after the S3 download is completed
File file = downloadService.downloadByS3Key(bucketName, example.getS3Key());
}
在这种情况下:
fetchExample(id) 使用 Hikari 池中的连接从数据库检索数据。 但是,直到该方法完成后才会释放连接,其中包括可能长时间运行的 S3 文件下载。 此行为会导致连接保持时间超过必要的时间,最终导致“检测到连接泄漏”警告。
问题 是否有临时解决方法或修补程序来确保数据检索完成后数据库连接立即返回到池中?
我知道完全禁用 OSIV 可能是一个永久的解决方案,但我需要更快的方法来在短期内缓解这个问题。
卸载 S3 下载。下载 20GB 文件时,您无需保持数据库连接。异步它,要么直接到另一个线程,要么使用队列。