jOOQ的fetchLazy()真的很懒吗?

时间:2014-10-07 17:41:35

标签: postgresql jdbc jooq

我正在使用jOOQ 3.4.2使用Scala查询PostgreSQL数据库。我想一次获取结果集的小块而不将整个结果集加载到内存中,因为查询可能返回许多行。我有以下代码:

val query = context.selectFrom(table)
                   .where(conditions)
                   .orderBy(orderField)
                   .fetchSize(1)
val cursor = query.fetchLazy()
// Iterate through cursor using cursor.fetchOne()

在我调用第一行之前,当我调用fetchLazy()时,jOOQ似乎会在内存中加载整个结果集(或者至少是结果集的一大块)从游标(通过调用recvfrom()时我看到的大量fetchLazy()系统调用来判断。我做错了吗?

2 个答案:

答案 0 :(得分:2)

  

我做错了吗?

不是来自jOOQ方面。这正是你如何确保jOOQ(通过ResultQuery.fetchLazy()Cursor.fetchOne())和JDBC驱动程序(通过ResultQuery.fetchSize(),转换为PreparedStatement.setFetchSize())将获取恰好一行的jOOQ一段时间。

但是,您可能已遇到this PostgreSQL JDBC driver caveat,并表示要使fetchSize生效,您必须在显式交易中运行查询。

答案 1 :(得分:2)

如果有人对MySQL有相同的问题:

MySQL要求将fetch size设置为 Integer.MIN_VALUE ,以向驱动程序指示应逐行提取结果:https://www.jooq.org/javadoc/3.9.1/org/jooq/ResultQuery.html#fetchSize

这样做将使jOOQ的fetchLazy()无需将整个结果集加载到内存中。