我们在使用 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 支持文档。还有这篇询问汤姆文章和这篇博客文章。
一个简短的答案是,当您的 Java 代码使用临时 lob 完成时,它不会调用 java.sql.Blob.free() - 并且使用连接池,数据库会话永远不会真正销毁,因此所有 lob 都会保留在内存中,直到您重新启动整个应用程序。您需要显式释放每个临时 blob。