JDBC Statement.SetFetchsize exaclty的工作原理

时间:2015-05-25 05:37:21

标签: java jdbc

我想在自定义JDBC驱动程序中实现this方法功能。我应该使用哪种方法来设置setMaxResults?

如果我的查询结果是1000行,并且我已设置setFetchSize = 100的值; 那么结果会是什么? 它将仅返回100行,或者在返回100之后,它将从db获得下一个100,直到1000行完成。

1 个答案:

答案 0 :(得分:4)

来自Statement.setFetchSize

  

为JDBC驱动程序提供有关当此ResultSet生成的Statement对象需要更多行时应从数据库中提取的行数的提示。如果指定的值为零,则忽略提示。默认值为零。

因此,如果你总共有1000行并且获取大小为100(假设驱动程序不忽略提示或提取大约nr),那么这意味着驱动程序将获取10批中的所有行每行100行。当本地没有可用的行来完成对next()的调用时,将获取一批行,这将在获取所有行或已到达maxRows之前完成。

这导致类似:

Statement stmt = ...;
stmt.setFetchSize(100);
ResultSet rs = ...;
rs.next(); // Triggers fetch of 100 rows, positions on row 1 / 100
rs.next(); // Positions on row 2 / 100
// 3-99 rs.next();
rs.next(); // Positions on row 100 / 100
rs.next(); // Triggers fetch of 100 rows, positions on row 101 / 200
// etc

理想情况下,从JDBC规范的角度来看。有些驱动程序忽略了提示(例如,如果将MySQL设置为Integer.MIN_VALUE并忽略所有其他值,则MySQL会滥用它来逐行获取),并且某些数据库将采用提示,但随后返回较少(有时更多)比请求的行。

我发现您链接的com.google.api.services.bigquery.model.QueryRequest.setMaxResults的文档并不完全清楚,但它似乎做同样的事情。