一尘不染

什么时候指定setFetchSize()?

mysql

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

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

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

Java文档

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

甲骨文文档

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

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


阅读 1216

收藏
2020-05-17

共1个答案

一尘不染

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

默认情况下,完全检索结果集并将其存储在内存中。在大多数情况下,这是最有效的操作方式,而且由于MySQL网络协议的设计更易于实现。如果您正在使用具有大量行或较大值的ResultSet,并且无法在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实现没有影响。

2020-05-17