[我看到了许多有关JDBC / MySQL的“最佳实践”指南,告诉我指定setFetchSize()。
但是,我不知道何时指定,以及要指定的内容(语句,结果集)。
Statement.setFetchSize() or PreparedStatement.setFetchSize()
ResultSet.setFetchSize()
Javadoc
默认值由创建结果集的Statement对象设置。提取大小可以随时更改。
Oracle文档
生成结果集后对语句对象的获取大小所做的更改将对该结果集没有影响。
如果我错了,请纠正我。这是否意味着setFetchSize仅在执行查询之前有效?(因此,ResultSet上的setFetchSize是无用的吗?但是碰巧“提取大小可能随时更改”?)
您应该从结果集的官方文档中阅读此page。它说
默认情况下,完全检索ResultSet并将其存储在内存中。在大多数情况下,这是最有效的操作方式,而且由于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实现无效。