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

2022-09-04 22:45:56

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

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

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

Javadoc

默认值由创建结果集的 Statement 对象设置。抓取大小可能随时更改。

甲骨文文档

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

如果我错了,请纠正我。这是否意味着 setFetchSize 在执行查询之前只是 Affective?(因此,在 ResultSet 上设置FetchSize 是无用的吗?但碰巧的是“获取大小可能随时更改”?


答案 1

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

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

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                            java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

只进、只读结果集与读取大小 Integer.MIN_VALUE 的组合可作为驱动程序逐行流式传输结果集的信号。在此之后,将使用该语句创建的任何结果集都将逐行检索。

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


答案 2

找到一篇很好的文章其中包含您的问题的示例:

https://www.baeldung.com/jdbc-resultset

7.1. 在语句 7.2 上使用提取大小。对结果集使用提取大小


推荐