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

Does jdbc dataset store all rows in jvm memory

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

视情况而定。不同的驱动程序可能表现不同,不同的 ResultSet settings 可能表现不同。

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

虽然增加获取大小可能会对性能有所帮助,但我也会考虑调整 SDU 大小,它控制 sqlnet 层的数据包大小。增加 SDU 大小可以加快数据传输速度。

当然,获取这 500,000 行所需的时间在很大程度上取决于您要获取的数据量。如果需要一个小时,我猜你正在获取大量数据 and/or 你是通过 WAN 从远程客户端获取的。

要更改 SDU 大小:

首先将服务器上的默认 SDU 大小更改为 32k(从 11.2.0.3 开始,您甚至可以使用 64kB,从 12c 开始最多 2MB),方法是在服务器上的 sqlnet.ora 中更改或添加此行: DEFAULT_SDU_SIZE=32767

然后修改你的JDBCURL: jdbc:oracle:thin:@(描述=(SDU=32767)(主机=...)(端口=...))(CONNECT_DATA=