jOOQ的fetchLazy()真的很懒吗?

问题描述:

我使用jOOQ 3.4.2来使用Scala查询PostgreSQL数据库。我希望一次只读取结果集的小块,而不将整个结果集加载到内存中,因为查询可能会返回许多行。我有以下代码:jOOQ的fetchLazy()真的很懒吗?

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

看来,jOOQ将加载整个结果集(或者至少在结果集中的大块)的记忆,当我打电话fetchLazy(),之前我连取第一从光标行(通过大量的recvfrom()系统调用来判断,我看到fetchLazy()被调用)。难道我做错了什么?

我做错了什么?

不是从jOOQ方面。这正是您如何确保jOOQ(通过ResultQuery.fetchLazy()Cursor.fetchOne())和JDBC驱动程序(通过ResultQuery.fetchSize(),转换为PreparedStatement.setFetchSize())每次只能提取一行的方式。

但是,您可能会遇到this PostgreSQL JDBC driver caveat,说要使fetchSize正常工作,您必须在显式事务中运行查询。

+0

据我所知,postgresql中的懒惰查询必须在事务中执行,以使其真正懒惰。 Postgresql jdbc驱动程序使用服务器端游标,它们只能在事务中使用。 – 2014-10-12 18:32:42

+0

@AndreyAntukh:是的,这就是链接堆栈溢出问题。我会很快更新我的答案 – 2014-10-13 06:41:43