Postgresql 是jOOQ';什么是真正的懒惰?

Postgresql 是jOOQ';什么是真正的懒惰?,postgresql,jdbc,jooq,Postgresql,Jdbc,Jooq,我正在使用JOOQ3.4.2使用Scala查询PostgreSQL数据库。我希望一次获取结果集的小块,而不将整个结果集加载到内存中,因为查询可能返回许多行。我有以下代码: val query = context.selectFrom(table) .where(conditions) .orderBy(orderField) .fetchSize(1) val cursor = qu

我正在使用JOOQ3.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似乎会在我甚至还没有从游标中获取第一行之前(从调用
fetchLazy()
时看到的大量
recvfrom()
系统调用来看),就将整个结果集(或至少是结果集的一大块)加载到内存中。我做错什么了吗

我做错什么了吗

不是从jOOQ那边。这正是确保jOOQ(via和)和JDBC驱动程序(via,翻译为)一次只能获取一行的方法


但是,您可能遇到过这样的情况,即为了使
fetchSize
正常工作,您必须在显式事务中运行查询。

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

MySQL要求将
fetch size
设置为Integer.MIN\u VALUE以向驱动程序指示应逐行获取结果:


这样做将使jOOQ的
fetchLazy()
在不将整个结果集加载到内存的情况下工作。

据我所知,postgresql中的惰性查询必须在事务中执行,才能使它们真正懒惰。Postgresql jdbc驱动程序使用服务器端游标,它们只在事务中工作。@AndreyAntukh:是的,链接堆栈溢出问题也是这么说的。我会很快更新我的答案