与Statement Object的setFetchSize方法混淆

Dar*_*tel 1 java resultset prepared-statement

最初,我问了这个问题

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

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

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

van*_*kel 7

MySQL驱动程序使用Integer.MIN_VALUE作为切换到流结果集模式的信号.它不用作值.请参阅"结果集"下的文档.综上所述:

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

所以这是MySQL Connector/J驱动程序非常具体的.

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

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