java - jdbc数据集是否将所有行存储在jvm内存中

标签 java oracle performance jdbc

我正在使用 java jdbc 应用程序从数据库中获取大约 500,000 条记录。使用的数据库是Oracle。获取每一行后,我将数据写入文件。由于完成获取整个数据大约需要一个小时,因此我尝试增加结果集的获取大小。我在多个链接中看到,在增加获取大小的同时,应该注意内存消耗。增加获取大小实际上会增加 jvm 使用的堆内存吗?
假设提取大小为 10,程序查询总共返回 100 行。在第一次获取期间,结果集包含 10 条记录。一旦我读取了前 10 条记录,结果集就会获取接下来的 10 条记录。这是否意味着在第二次获取之后,数据集将包含 20 条记录?较早的 10 条记录是否仍保留在内存中,还是在获取较新批处理时将其删除? 如有任何帮助,我们将不胜感激。

最佳答案

这要看情况。不同的驱动程序可能表现不同且不同ResultSet settings行为可能会有所不同。

如果您有 CONCUR_READ_ONLYFETCH_FORWARDTYPE_FORWARD_ONLY ResultSet,驱动程序几乎肯定会主动存储在内存 与您的提取大小相对应的行数(当然,较早行的数据将在内存中保留一段时间,直到被垃圾收集)。另一方面,如果您有一个 TYPE_SCROLL_INSENSITIVE ResultSet,则驱动程序很可能会将获取的所有数据存储在内存中,以便您可以滚动向后和向前浏览数据。这不是实现此行为的唯一可能方法,因此不同的驱动程序(以及不同版本的驱动程序)可能有不同的行为,但这是我遇到的大多数驱动程序最简单的行为方式。

关于java - jdbc数据集是否将所有行存储在jvm内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29549022/

相关文章:

python - 为什么 python3 的加载时间是 python2 的两倍?

java - 缓存数据库中存在的图像

java - Jax-ws @PreDestroy 什么时候被准确调用?

mysql - SQL 列表项不重复第一个

php - 在 Laravel 中计算 MySQL 数据库中行数的最快方法?

java - 使用 JPA,方法需要 60 秒

java - 授予单一类权限

java - 我已经使用 Freemarker 模板编写了一个 java 程序,但它显示了已弃用的错误。我无法理解

mysql - Oracle:获取具有相同日期的最后一条记录

java - 如何在 Java 中调用这个 PLSQL 过程?