Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该在什么时候指定setFetchSize()?_Java_Mysql_Sql_Oracle_Jdbc - Fatal编程技术网

Java 我应该在什么时候指定setFetchSize()?

Java 我应该在什么时候指定setFetchSize()?,java,mysql,sql,oracle,jdbc,Java,Mysql,Sql,Oracle,Jdbc,我看到很多关于JDBC/MySQL的“最佳实践”指南,它们告诉我指定setFetchSize() 但是,我不知道何时指定,以及指定什么(语句、结果集) Statement.setFetchSize() or PreparedStatement.setFetchSize() ResultSet.setFetchSize() 在这两种情况中,我应该具体说明什么 从和开始,这就是我对“何时”感到困惑的地方 Javadoc 默认值由创建结果集的语句对象设置。提取大小可以随时更改 甲骨文文档 在生成结

我看到很多关于JDBC/MySQL的“最佳实践”指南,它们告诉我指定setFetchSize()

但是,我不知道何时指定,以及指定什么(语句、结果集)

Statement.setFetchSize() or PreparedStatement.setFetchSize() 
ResultSet.setFetchSize()
  • 在这两种情况中,我应该具体说明什么
  • 从和开始,这就是我对“何时”感到困惑的地方
  • Javadoc

    默认值由创建结果集的语句对象设置。提取大小可以随时更改

    甲骨文文档

    在生成结果集后对语句对象的获取大小所做的更改对该结果集没有影响

    如果我错了,请纠正我。这是否意味着setFetchSize仅在执行查询之前有效?(因此,结果集上的setFetchSize是无用的?但“提取大小可能随时更改”?)

    您应该从结果集的官方文档中阅读此内容。上面说

    默认情况下,结果集被完全检索并存储在内存中。在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计更易于实现。如果您使用的结果集具有大量行或大值,并且无法在JVM中为所需内存分配堆空间,则可以告诉驱动程序一次将结果流回到一行

    一个前向只读结果集与一个Integer.MIN_值的fetch size的组合作为一个信号发送给驱动程序,以逐行传输结果集。在此之后,将逐行检索使用该语句创建的任何结果集


    实际上,仅设置fetchSize对connector-j实现没有任何影响。

    找到了一篇好文章,其中包含了示例来回答您的问题:

    7.1。在语句上使用Fetch Size
    7.2. 使用ResultSet上的Fetch Size

    第二个链接是针对Oracle JDBC驱动程序(即Oracle数据库),而不是“通用”JDBC文档,尤其是针对MySQL。您应该查看MySQL JDBC手册以了解该实现的详细信息。@a_horse_,带有_no_名称,感谢您指出这一点。很明显,我应该先检查一下……这只适用于MySQL,大多数其他数据库和JDBC驱动程序的性能都比这好。没错,但问题是关于MySQL的,至少部分是关于MySQL的。因为这个问题也涉及到Oracle文档,所以我将其视为一般JDBC问题;这是我对MySQL连接器/J实现最恼火的地方之一…:)在浪费了一些时间尝试其他方法之后,我可以确认Connector/J确实只支持返回整个结果集,或者一次一个地流式处理它们。我希望返回10000个批次,但源代码专门检查Integer.MIN_值,如果指定了任何其他值,则返回所有内容。对于任何使用JDBI()的人来说,将fetch大小添加到查询中就足够了,因为其他标志已经具有正确的值:handle.createQuery(sql).setFetchSize(Integer.MIN_VALUE).map()/fold()etc这是(不再)true;当设置JDBC选项
    useServerFetch
    时,MySQL实际上支持任何正的fetch大小。然而,有一些警告;见我对这个类似问题的回答:
    stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                                java.sql.ResultSet.CONCUR_READ_ONLY);
    stmt.setFetchSize(Integer.MIN_VALUE);