【问题标题】:Mysql streaming result set and jOOQ fetchLazyMysql 流结果集和 jOOQ fetchLazy
【发布时间】:2012-04-14 12:55:33
【问题描述】:

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

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 获得流式结果集吗?

【问题讨论】:

  • 我自己从未使用过它,但快速浏览一下文档会提到您必须在底层语句上设置 setFetchSize() (尽管这似乎违背了覆盖的目的......)。跨度>

标签: java mysql jdbc jooq


【解决方案1】:

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

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

参数:

rows要获取的行数

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

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

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

【讨论】:

  • 不,使用1 的提取大小我得到OutOfMemoryError。我终于结束了使用 JDBC。但我肯定会等待下一个 jOOQ 版本:)
  • @dusan:可惜 MySQL 没有遵循 JDBC 规范。但修复将在一周内发布。 A preview is available here
猜你喜欢
  • 2018-03-31
  • 2015-07-18
  • 2014-12-02
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 2016-02-05
相关资源
最近更新 更多