gpt4 book ai didi

java - 与 Statement 对象的 setFetchSize 方法混淆

转载 作者:行者123 更新时间:2023-11-29 06:34:05 33 4
gpt4 key购买 nike

最初,我问this问题

我通过将 fetchSize 设置为 Integer.MIN_VALUE 来解决这个问题,但我对此有一些疑问

  1. 当我将 fetchSize 设置为 10 或其他正整数时它不起作用,将其设置为 Integer.MIN_VALUE 后它起作用,这是为什么?
  2. 如果我们设置负值,那么它会给出非法值错误,但是 Integer.MIN_VALUE-2147483648 那么为什么它不给出错误?
  3. 此表包含 600 万条记录,我在获取 100 或 200 条记录后关闭了 resultset,这需要 30-35 秒的时间。
  4. 减少关闭该 resultset 时间的解决方案。

我想在这里补充一些东西我已经用 MySQL 驱动程序对此进行了测试,它接受 Integer.MIN_VALUE但是当我在 SQL Server 中测试相同的代码时,它会给出错误 The fetch size cannot be negative. 如果我将它设置为 10 那么它可以工作,它也适用于 Oracle。

最佳答案

Integer.MIN_VALUE 被 MySQL 驱动程序用作切换到流式结果集模式的信号。它不用作值。参见 the documentation ,在“结果集”下。总结:

默认情况下,ResultSets 被完全检索并存储在内存中。您可以通过设置 stmt.setFetchSize(Integer.MIN_VALUE);(结合只进、只读的结果集)告诉驱动程序将结果一次流回一行。

所以这是非常特定于 MySQL Connector/J 驱动程序的。

至于为什么关闭结果集需要很长时间,同一文档也暗示了这一点:“您必须先读取结果集中的所有行(或关闭它),然后才能发出任何其他查询连接,否则将抛出异常。”
即关闭结果集将首先读取所有剩余行,然后关闭结果集。由于现在逐行读取行,因此可能需要很长时间。 this question 中也描述了此问题和解决方法/破解方法.

看起来(我还没有测试过)有一个流式结果集的替代方案可以做你想做的事(不使用 MySQL limit 子句),它涉及 configuration property useCursorFetch=true 和用法说明 here .

关于java - 与 Statement 对象的 setFetchSize 方法混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25019410/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com