【问题标题】:Is jOOQ's fetchLazy() truly lazy?jOOQ 的 fetchLazy() 真的是懒惰的吗?
【发布时间】:2014-12-02 05:31:47
【问题描述】:

我正在使用 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 似乎会在内存中加载整个结果集(或至少一大块结果集),然后我什至从光标(根据我在调用fetchLazy() 时看到的大量recvfrom() 系统调用来判断)。我做错了吗?

【问题讨论】:

    标签: postgresql jdbc jooq


    【解决方案1】:

    我做错了吗?

    不是来自 jOOQ 方面。这正是确保 jOOQ(通过 ResultQuery.fetchLazy() 和 Cursor.fetchOne())和 JDBC 驱动程序(通过 ResultQuery.fetchSize(),转换为 PreparedStatement.setFetchSize())一次只获取一行的方式。

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

    【讨论】:

    • 据我所知,postgresql 中的惰性查询必须在事务中执行才能使它们真正变得惰性。 Postgresql jdbc 驱动程序使用服务器端游标,它们只在事务中工作。
    • @AndreyAntukh:是的,链接的 Stack Overflow 问题也是这么说的。我会尽快更新我的答案
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2018-03-31
      • 2011-03-24
      • 2019-04-07
      相关资源
      最近更新 更多