JDBC Statement.setFetchsize 的具体工作原理

vvp*_*vvp 2 java jdbc

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

如果我的查询结果是1000行,并且我设置了setFetchSize=100,那么结果会是什么?它将仅返回 100 行,或者在返回前 100 行后,它将从数据库获取下 100 行,直到完成 1000 行。

Mar*_*eel 6

Statement.setFetchSize

ResultSet当由此生成的对象需要更多行时,向 JDBC 驱动程序提供有关应从数据库获取的行数的提示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
Run Code Online (Sandbox Code Playgroud)

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

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