4

通常,当我想使用 Mysql 查询大型结果集时,我会写这个(取自这个答案):

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

现在我正在使用jOOQ 2.0.5,但我无法获得相同的结果。

我试过打电话fetchLazy没有运气,它将整个结果集加载到内存中:

Cursor<Record> result = query.fetchLazy(Integer.MIN_VALUE);

作为一种解决方法,我可以使用 sql 查询query.getSQL()并创建一个适合Statement执行它的方法。

还有另一种使用 jOOQ 获得流结果集的方法吗?

4

1 回答 1

4

根据 JDBC 规范,Integer.MIN_VALUE不是该Statement.setFetchSize()方法的有效参数:

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

参数:

rows要获取的行数

抛出: SQLException - 如果发生数据库访问错误,则在关闭的语句上调用此方法或不满足条件 rows >= 0。

实现可能会抛出SQLException负提取大小。因此,jOOQ 不接受小于 0 的参数。您应该尝试使用 fetch size1代替。同时,jOOQ 的下一个版本可能会打破 JDBC 标准,以支持这个记录在案的 MySQL 特性

https://github.com/jOOQ/jOOQ/issues/1263(在jOOQ 2.2.0中实现)

于 2012-03-31T05:36:14.860 回答