有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在使用JavaJDBC应用程序从数据库中获取大约500000条记录。正在使用的数据库是Oracle。我在获取每一行后立即将数据写入文件。由于完成整个数据的获取大约需要一个小时,因此我正在尝试增加结果集的获取大小。我在多个链接中看到,在增加获取大小时,应该注意内存消耗。增加获取大小实际上会增加jvm使用的堆内存吗
假设fetch大小为10,并且程序查询总共返回100行。在第一次获取期间,结果集包含10条记录。读取前10条记录后,resultset将获取下10条记录。这是否意味着在第二次提取之后,数据集将包含20条记录?之前的10条记录是否仍保留在内存中,或者在获取新的批处理时是否将其删除? 感谢您的帮助


共 (2) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    虽然增加fetch大小可能有助于提高性能,但我还将研究如何调整SDU大小,SDU大小在sqlnet层控制数据包的大小。增加SDU大小可以加快数据传输

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

    要更改SDU大小:

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

    然后修改您的JDBC URL: jdbc:oracle:thin:@(DESCRIPTION=(SDU=32767)(HOST=…)(端口=…)(连接数据=