当前位置: 首页 > 知识库问答 >
问题:

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

孟财
2023-03-14

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

共有2个答案

端木澄邈
2023-03-14

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

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

要更改SDU大小:

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

然后修改你的JDBC网址:JDBC:Oracle:thin:@(DESCRIPTION =(SDU = 32767)(HOST =...)(端口=...))(连接数据=

柯瀚玥
2023-03-14

这要视情况而定。不同的驱动程序可能具有不同的行为,不同的 ResultSet 设置的行为可能不同。

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

 类似资料:
  • 问题内容: 我正在使用Java JDBC应用程序从数据库中获取约500,000条记录。使用的数据库是Oracle。取出每一行后,我立即将数据写入文件。由于完成整个数据的获取大约需要一个小时,因此我试图增加结果集的获取大小。我已经在多个链接中看到,在增加访存大小的同时,应该注意内存消耗。增加获取大小实际上是否会增加jvm使用的堆内存? 假设获取大小为10,并且程序查询总共返回100行。在第一次读取期

  • 问题内容: 我阅读了JVM内存模型,并对以下内容感到困惑: JVM是否将.class实例存储在其内存中。如果是,则在哪个区域。 就像在加载类后,JVM生成了机器级代码,然后开始执行机器代码指令,然后仅在堆上创建对象,并填充了方法区域。 perm gen等区域存储字节码还是机器级代码? 烫发与方法面积 我真的很感谢您对此主题的任何帮助。 谢谢。 问题答案: 1)文件将在加载时存储在permgen存储

  • 主要内容:程序员的幽默计算机要处理的信息是多种多样的,如数字、文字、符号、图形、音频、视频等,这些信息在人们的眼里是不同的。但对于计算机来说,它们在内存中都是一样的,都是以二进制的形式来表示。 要想学习编程,就必须了解二进制,它是计算机处理数据的基础。 内存条是一个非常精密的部件,包含了上亿个电子元器件,它们很小,达到了纳米级别。这些元器件,实际上就是电路;电路的电压会变化,要么是 0V,要么是 5V,只有这两种电压。

  • 在具有管道和转发功能的MIPS体系结构上: add指令将在步骤3(执行操作)准备好结果,但我假设sw指令希望在步骤2(指令解码)得到结果 David A. Patterson的《计算机组织与设计》一书中有一个已解决的练习:在以下代码段中找到危险并重新排序指令以避免任何管道停滞: 解决方案: 在解决方案中,它正确识别加载使用危险并相应地重新排列代码,但是否也存在执行存储危险?

  • 我有一个df1,看起来像这样: 第二个df2看起来像这样: 我想检查df1中的所有父ID是否都存在于df2中。如果没有,我想在新的df中提取它们,例如: 我相信可以使用连接,但我不确定如何使用

  • JVM内存分为:1.方法区2.堆区3.堆栈4.PC寄存器5.本机堆栈 > 现在假设我有一个属性为“int[]dealCodes”(int基元数组)的类。根据内存管理,一旦处理代码初始化,内存中就会有连续内存分配(total_elements*4字节)。所以,如果数组大小为10,则JVM内存中有40字节的分配。 我的问题是,这40个字节将分配到哪个区域(堆还是堆栈)? 我对数组的理解是:它就像任何其