与Statement Object的setFetchSize方法混淆

时间:2014-07-29 15:42:23

标签: java prepared-statement resultset

最初,我问了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
  5. 的时间的解决方案

    我想在这里添加更多内容 我用MySQL驱动程序对它进行了测试,它接受Integer.MIN_VALUE 但是当我在SQL服务器中测试相同的代码时,它会给出错误The fetch size cannot be negative.,如果我将其设置为10然后它可以工作,它也适用于Oracle。

1 个答案:

答案 0 :(得分:6)

MySQL驱动程序使用Integer.MIN_VALUE作为切换到流结果集模式的信号。它不用作值。请参阅&{34;结果集"下的the documentation。总结:

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

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

至于为什么关闭结果集需要很长时间,同样的文档也暗示了这一点:"您必须先阅读结果集中的所有行(或关闭它),然后才能发出任何行连接上的其他查询,或者将抛出异常。 "
即关闭结果集将首先读取所有剩余行,然后关闭结果集。由于读取行现在是逐行完成的,因此可能需要很长时间。 this question中也描述了此问题和变通方法/黑客攻击。

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