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

Jee*_*oon 11 java mysql sql oracle jdbc

我看到很多JDBC/MySQL的"最佳实践"指南告诉我指定setFetchSize().

但是,我不知道何时指定,以及要指定的内容(语句,结果集).

Statement.setFetchSize() or PreparedStatement.setFetchSize() 
ResultSet.setFetchSize()
Run Code Online (Sandbox Code Playgroud)
  1. 在这两个中,我应该指定什么?
  2. javadocoracle文档中,这是我对"何时"感到困惑的地方

的Javadoc

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

Oracle Doc

生成结果集后对语句对象的提取大小所做的更改将不会影响该结果集.

如果我错了,请纠正我.这是否意味着setFetchSize在执行查询之前只是Affective?(因此,ResultSet上的setFetchSize是无用的?但是恰好"可以随时更改获取大小"?)

And*_*and 5

您应该从结果集的官方文档中阅读此页面.它说

默认情况下,ResultSet完全检索并存储在内存中.在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计更容易实现.如果您使用的是有大量行或大值的结果集工作,并在你的JVM所需的内存不能分配堆空​​间,你可以告诉司机在时间流的结果返回一行.

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                            java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
Run Code Online (Sandbox Code Playgroud)

的仅向前的组合,只读结果集,并且Integer.MIN_VALUE的的读取大小用作信号到驱动器以流结果集一行接一行.在此之后,将逐行检索使用该语句创建的任何结果集.

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

  • 在浪费了一些时间尝试替代方案之后,我可以确认 Connector/J 确实只支持返回整个结果集,或者一次流式传输一个结果集。我希望返回 10,000 个批次,但源代码专门检查 Integer.MIN_VALUE 并返回所有指定的其他值。对于任何使用 JDBI (http://jdbi.org/) 的人来说,将提取大小添加到查询中就足够了,因为其他标志已经处于正确的值:handle.createQuery(sql) .setFetchSize(Integer.MIN_VALUE) .map ()/折叠()等 (2认同)
  • 这是(不再)真实; 在设置JDBC选项`useServerFetch`时,MySQL实际上支持任何正读取大小.但是,有一些警告; 看到我对这个类似问题的回答:http://stackoverflow.com/a/36986532/1016939 (2认同)