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