与Statement Object的setFetchSize方法混淆



一开始,我问了这个问题

我通过将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服务器中测试相同的代码时,它给出了错误The fetch size cannot be negative.,如果我将其设置为10,那么它也适用于Oracle。

整数。MIN_VALUE被MySQL驱动程序用作切换到流结果集模式的信号。它不用作值。请参阅文档中的"Resultset"。总之:

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

所以这是非常特定于MySQL连接器/J驱动程序的

至于关闭结果集需要很长时间的原因,同样的文档也暗示了这一点:"在对连接发出任何其他查询之前,必须读取结果集中的所有行(或关闭它),否则将抛出异常。"
。关闭结果集将首先读取所有剩余的行,然后关闭结果集。由于现在读取行是逐行完成的,因此可能需要很长时间。这个问题也描述了这个问题和解决方法/破解方法。

看起来(我还没有测试过)有一个流结果集的替代方案,可以做你想做的(不使用MySQL限制子句),它涉及配置属性useCursorFetch=true和用法在这里解释。

相关内容

  • 没有找到相关文章

最新更新