Oracle TemporaryLobs 导致内存泄漏

问题描述 投票:0回答:1

我们在使用 Oracle 21c 作为数据源的 Spring Boot 应用程序 (Spring Boot 2.7.x) 上遇到问题。在执行过程中,我们遇到了一系列由于使用Blob而导致的OoM。

我们做了一些应用程序转储,结果如下

我们已经了解了 blob 对象如何保存在临时Lobs 列表中,该列表由 Oracle 驱动程序直接管理。我们无法使用用于与 Oracle 数据库交互的 Spring Jdbc (5.3.25) 库与此列表进行交互。

有人可以帮助我们吗?

这是我们的 pom.xml 的片段

<dependency>
    <groupId>com.oracle.ojdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>19.3.0.0</version>
</dependency>

<dependency>
    <groupId>com.oracle.database.nls</groupId>
    <artifactId>orai18n</artifactId>
    <version>21.5.0.0</version>
</dependency>
oracle spring-boot memory-leaks blob spring-jdbc
1个回答
0
投票

请参阅这个类似的问题,或这个问题,或这个 Oracle 支持文档。还有这篇询问汤姆文章这篇博客文章

一个简短的答案是,当您的 Java 代码使用临时 lob 完成时,它不会调用 java.sql.Blob.free() - 并且使用连接池,数据库会话永远不会真正销毁,因此所有 lob 都会保留在内存中,直到您重新启动整个应用程序。您需要显式释放每个临时 blob。

© www.soinside.com 2019 - 2024. All rights reserved.