我正在使用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()
系统调用来判断。我做错了吗?
答案 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()
无需将整个结果集加载到内存中。