我们遇到了一个使用Oracle 21 c作为内存的Sping Boot 应用程序(Sping Boot 2.7.x)的问题。在执行过程中,我们运行在一系列由于使用Blob而导致的OoM中。
我们做了一些应用程序转储,结果如下
的数据
我们已经看到了blob对象是如何在temporaryLobs列表中持久化的,该列表直接由Oracle驱动程序管理。我们不可能使用Spring Jdbc(5.3.25)库与此列表交互,该库用于与Oracle数据库接口。
有人能帮我们吗?
下面是我们的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>
字符串
1条答案
按热度按时间yh2wf1be1#
参见this similar question或this one或this Oracle support document。还有this Ask Tom article和this blog post。
一个简短的答案是,当你的Java代码使用临时的blob时,它并没有调用java.sql.Blob.free(),而使用连接池,数据库会话永远不会被真正销毁,所以所有的blob都留在内存中,直到你重新启动整个应用程序。你需要显式地释放每个临时的blob。