ResultSet 的最大识别提取大小是多少[关闭]

Posted

技术标签:

【中文标题】ResultSet 的最大识别提取大小是多少[关闭]【英文标题】:What is the maximum recognized fetch size for a ResultSet [closed] 【发布时间】:2012-12-14 16:51:24 【问题描述】:

如标题所述,Java ResultSet 对象可识别的最大大小是多少?特别是setFetchSize 函数。

ResultSet results...;
results.setFetchSize(HUGE_VALUE);

更重要的是,如果没有“最大值”,那么 fetch 大小的限制因素是什么?

评论

int 是数据类型,所以我猜它会接受到 MAX_INT,剩下的 事情取决于驱动程序的实现。

尽管这可能与我的问题无关,但我问的是什么是公认的,而不是我可以传递给它的。虽然这听起来像是扯淡,但这就是这个问题的本质。

更新

因为这似乎得到了一些“不是真正的问题”的密切投票。这是专门针对 Oracle JDBC 驱动程序的,ojdbc14。正如有人在下面发布的那样,我正在撤回数亿个结果集,因此根据我的测试,30 或 200 远不是正确获取大小的正确答案。目前我的获取大小是10,000,000,但我无法验证数据库使用的大小是 1000 万。此外,我了解数据库提示的工作原理,而且根据我的经验,您通常可以让数据库使用您提供的提示。

【问题讨论】:

请记住,获取大小只是一个提示。因此 JDBC 驱动程序可以随意忽略它(或选择不同的值)。例如,如果它认为您传入的值太大。 @Nambari 当然,但它真的能识别 MAX_INT 吗? 您可以传递任何您想要的正整数,并且驱动程序可以随意忽略它。我看不出文档是如何含糊的。如果您的特定驱动程序选择不忽略它,即使对于疯狂的值,并且您传递了 MAX_INT,并且实际上有 2^31 行要获取,您可能会收到 OutOfMemoryError。 它说:“给 JDBC 驱动程序一个提示”。提示是建议,而不是命令。 例如 mysql 驱动程序总是忽略(或至少:曾经忽略)除 Integer.MIN_VALUE 之外的任何 fetchsize,这将导致它逐行获取,而不是获取所有(从而耗尽大型结果集的内存) 【参考方案1】:

我怀疑setFetchSize() 方法没有按照您的想法执行,建议您仔细阅读以下两篇文章,并在使用像 10,000,000 这样的值之前进行一些认真的分析。 This article 解释了 JDBC setFetchSize 如何等同于 Oracle 的预取功能。它还演示了如何设置一些简单的分析来检查不同提取大小的影响。 This article(由第一个链接)解释说预取没有最大值(除了我假设 MAX_INT),但警告不要使用远大于几百的值。第二篇文章还提到了以下内容,进一步证实了 setFetchSize 和 prefetching 之间的联系:

不要混用 JDBC 2.0 fetch size 应用程序编程接口 (API) 和应用程序中的 Oracle 行预取 API。你可以 使用其中一种,但不能同时使用。

【讨论】:

【参考方案2】:

这是对数据库的提示。有些人甚至可能不会使用这个提示。其他人可能允许一个非常大的值,直到 int 数据类型限制。然而,大多数人会接受这个提示,直到最大的合理值。请记住,此数字越大,处理结果时需要使用的内存就越多。

这只是好奇还是您打算将其设置为您的数据库最大获取大小?如果是后者,我强烈建议您反对。相反,正确的一些测试和性能测试基于不同的 fetch size 提示。在某些数据库中,30 可能是最佳的,而 200 会使处理速度更慢。正确的数字还取决于行的大小或任何 blob 数据等。

所以,一个更好的问题可能是——在这个特定数据库上,这个查询的最佳提取大小是多少,答案是尝试它们并衡量性能。

【讨论】:

这为我提供了零信息。

以上是关于ResultSet 的最大识别提取大小是多少[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Android 上 SQLite 数据库的最大大小是多少?

虹软人脸识别1000人左右网络识别大概多少ms?

如何在java中获取Resultset的长度或大小[重复]

新浪微博gif图片最大有效显示尺寸是多少

从PDF python中提取/识别表[关闭]

win10能识别多大硬盘