Mysql的流结果集,并jOOQ fetchLazy

问题描述:

通常当我想使用MySQL查询大结果集我写这篇文章(从this answer拍摄):Mysql的流结果集,并jOOQ fetchLazy

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); 

作为一种变通方法,我可以得到使用query.getSQL() SQL查询,然后创建一个合适的Statement来执行它。

是否有另一种方法使用jOOQ来获得流结果集?

+0

从来没有使用过自己,但看一眼通过文档中提到你必须在底层语句上设置setFetchSize()(尽管这似乎击败了覆盖的目的...)。 – Corbin 2012-03-30 20:17:09

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

为JDBC驱动程序提供提示以应从当更多的行是数据库中提取的行数本语句生成的ResultSet对象需要使用它。如果指定的值为零,则提示将被忽略。默认值为零。

参数:

的行数来获取

抛出: SQLException - 如果发生数据库访问错误,该方法被称为在关闭的语句或条件的行> = 0不满足。

对于否定提取大小,实现可能会抛出SQLException。因此,jOOQ不接受小于0的参数。您应该尝试使用取值大小1来代替。与此同时,jOOQ的下一个版本或许能打破JDBC标准,以支持这一documented MySQL feature

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

+0

@dusan:将抓取大小设置为“1”是否适合您? – 2012-03-31 23:45:37

+0

不,使用1的读取大小,我得到一个'OutOfMemoryError'。我终于用JDBC结束了。但我肯定会等待下一个jOOQ发布:) – dusan 2012-04-02 15:11:05

+1

@dusan:太糟糕了MySQL不遵循JDBC规范。但修补程序将在一周内发布。 [预览在这里可用](https://oss.sonatype.org/content/repositories/snapshots/org/jooq/) – 2012-04-02 15:15:51