我正在使用一个java应用程序从DB中获取大约50万条记录。正在使用的数据库是Oracle。获取每一行后,我立即将数据写入文件中。因为完成整个数据的提取大约需要一个小时,所以我试图增加结果集的提取大小。我在多个链接中看到,在增加获取大小的同时,应该小心内存消耗。增加获取大小实际上会增加jvm使用的堆内存吗?
假设获取大小为10,程序查询总共返回100行。在第一个提取过程中,结果集包含10条记录。读取前10条记录后,结果集将获取下一条记录。这是否意味着在第二次获取之后,数据集将包含20条记录?之前的10条记录是否仍然保存在内存中,还是在获取更新的批处理时被删除?任何帮助都是非常感谢的。
发布于 2015-04-09 22:06:37
那得看情况。不同的驱动程序可能有不同的行为,不同的 settings可能有不同的行为。
如果您有一个CONCUR_READ_ONLY、FETCH_FORWARD、TYPE_FORWARD_ONLY ResultSet,那么驱动程序几乎肯定会在内存中主动地存储与您的提取大小相对应的行数(当然,以前的行的数据将在内存中保留一段时间,直到被垃圾收集)。另一方面,如果您有一个TYPE_SCROLL_INSENSITIVE ResultSet,那么驱动程序很可能会存储在内存中的所有数据,以便您能够前后滚动数据。这并不是实现此行为的唯一可能方法,因此不同的驱动程序(以及不同版本的驱动程序)可能有不同的行为,但这是最简单的,也是大多数我遇到的驱动程序的行为方式。
发布于 2015-04-11 01:16:33
虽然增加获取大小可能会对性能有所帮助,但我也会考虑调整SDU大小,SDU大小控制sqlnet层的数据包大小。增加SDU大小可以加快数据传输。
当然,获取这50万行所需的时间在很大程度上取决于您要获取的数据数量。如果需要一个小时,我猜您正在获取大量数据和/或通过广域网从远程客户端获取数据。
以更改SDU大小:
首先,将服务器上的默认SDU大小更改为32k (从11.2.0.3开始,您甚至可以使用64 in,从12c开始最多可以使用2MB ),方法是在服务器上的sqlnet.ora中更改或添加以下行: DEFAULT_SDU_SIZE=32767
然后修改JDBC : jdbc:oracle:thin:@(DESCRIPTION=(SDU=32767)(HOST=...)(PORT=...))(CONNECT_DATA=
https://stackoverflow.com/questions/29549022
复制相似问题