使用 Oracle JDBC 的大型结果集,是否可以关闭游标提取?(抓取大小问题)



>我有一个情况,我需要有效地将大约 ~100 万行加载到内存中进行处理。我为此使用oracle和普通JDBC。

如果我不设置获取大小,则使用 oracle 驱动程序默认值 10,这意味着它将需要 100k 往返,这使得性能效率极低。如果我将提取大小增加到非常大的大小,例如 500k 或 1m,则数据将在大约 5 秒内加载。

不幸的是,我无法将提取大小设置为类似 INT_MAX 的内容,因为 oracle 驱动程序根据提取大小预先分配缓冲区。

我真正想要的是一种强制 JDBC 简单地获取所有行而不使用游标或执行任何增量获取的方法。我想以最节省内存的方式做到这一点。

有没有办法告诉预言机只获取所有数据而不进行任何获取?

12 个驱动程序在每行的提取大小中每列分配 15 个字节,用于簿记加上实际数据大小。因此,如果您将提取大小设置为 1G,则 12 驱动程序将分配 15GB 用于簿记以及实际数据。因此,根据您拥有的内存量,您可以将提取大小设置为您拥有的内存支持的任何大小。

在 12 之前,驱动程序分配了更多的内存,因此提取大小必须小得多。

没有办法告诉司机只在一次往返中获取所有行。

编辑 2017-03-10:我们已经测试了多达 2G 行,最近发布的 12.2 驱动程序使用FORWARD_ONLY结果集处理此问题。它们将使用SCROLL_INSENSITIVE结果集处理多达 1,802,723,000 行。这是一个预期的限制。很明显,这是一台巨大的机器和一个巨大的堆。

最新更新