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

时间:2015-04-09 21:06:21

标签: java oracle performance jdbc

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

2 个答案:

答案 0 :(得分:2)

这取决于。不同的驱动程序可能表现不同,不同的ResultSet settings可能表现不同。

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

答案 1 :(得分:1)

虽然增加获取大小可能有助于提高性能,但我也会考虑调整SDU大小来控制sqlnet层的数据包大小。增加SDU大小可以加速数据传输。

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

更改SDU尺寸:

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

然后修改您的JDBC URL: JDBC:预言:瘦:@(DESCRIPTION =(SDU = 32767)(HOST = ...)(PORT = ...))(CONNECT_DATA =