我正在使用Java JDBC应用程序从数据库中获取约500,000条记录。使用的数据库是Oracle。取出每一行后,我立即将数据写入文件。由于完成整个数据的获取大约需要一个小时,因此我试图增加结果集的获取大小。我已经在多个链接中看到,在增加访存大小的同时,应该注意内存消耗。增加获取大小实际上是否会增加jvm使用的堆内存? 假设获取大小为10,并且程序查询总共返回100行。在第一次读取期间,结果集包含10条记录。读取前10条记录后,结果集将获取下10条记录。这是否意味着在第二次获取后,数据集将包含20条记录?较早的10条记录是否仍保留在内存中,还是在获取较新的批次时将其删除了?任何帮助表示赞赏。
这取决于。不同的驱动程序可能会有所不同,并且不同的ResultSet设置可能会有所不同。
ResultSet
如果你有CONCUR_READ_ONLY,FETCH_FORWARD,TYPE_FORWARD_ONLY ResultSet,司机几乎肯定会积极地存储在内存中的行数对应于您的获取大小(较早行,当然数据将保留在内存中一段时间,直到它被收集的垃圾)。TYPE_SCROLL_INSENSITIVE ResultSet另一方面,如果您有一个,驱动程序很有可能会将获取的所有数据存储在内存中,以便允许您在数据之间来回滚动。这不是实现此行为的唯一可能方法,因此不同的驱动程序(和不同版本的驱动程序)可能具有不同的行为,但这是我遇到的大多数驱动程序的最简单方式。
CONCUR_READ_ONLY
FETCH_FORWARD
TYPE_FORWARD_ONLY
TYPE_SCROLL_INSENSITIVE