java - 使用 Oracle JDBC 的大型结果集,我可以关闭游标获取吗? (获取大小问题)

标签 java sql oracle jdbc

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

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

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

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

有没有办法告诉oracle只获取所有数据而不进行任何提取?

最佳答案

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

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

无法告诉驱动程序在一次往返中获取所有行。

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

关于java - 使用 Oracle JDBC 的大型结果集,我可以关闭游标获取吗? (获取大小问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41981742/

相关文章:

Java 垃圾收集 - 发生一次 FULL GC

java - 是否需要 Class.forName() 机制?

java - 如何计算我的应用程序中特定事件的耗时?

SQL 查找具有一个值的记录

mysql - 每行列子集为空的表的正确设计

database - 一个数据库中出现“SQL 命令未正确结束”错误,但另一个数据库却没有,使用相同的脚本创建序列

java - 通过 jdbc 获取 Oracle DB LONG 类型的速度非常慢

java - 如果另一个提供服务的包更新了 Java,为什么依赖包不会被通知/刷新?

mysql - 使用 SQL 如何获取重复出现两次以上的列?

oracle - Sqoop Oracle Import 不创建表