适用于以下版本: Dev (3.21) | 最新版 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

懒加载

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

与 JDBC 的 java.sql.ResultSet 不同,jOOQ 的 org.jooq.Result 不代表具有各种提取模式和滚动模式的打开的数据库游标,使用后需要关闭。jOOQ 的结果是简单的内存 Java java.util.List 对象,包含所有结果值。如果您的结果集很大,或者您有很多网络延迟,您可能希望逐个或小块地提取记录。jOOQ 支持 org.jooq.Cursor 类型来实现此目的。为了获得这样的引用,请使用 ResultQuery.fetchLazy() 方法。这里给出了一个例子

// Obtain a Cursor reference:
try (Cursor<BookRecord> cursor = create.selectFrom(BOOK).fetchLazy()) {

    // Cursor has similar methods as Iterator<R>
    while (cursor.hasNext()) {
        BookRecord book = cursor.fetchOne();

        Util.doThingsWithBook(book);
    }
}

由于 org.jooq.Cursor 保留对打开的 java.sql.ResultSet 的内部引用,因此可能需要在迭代结束时将其关闭。如果游标完全滚动完毕,它将方便地关闭底层 ResultSet。但是,您不应该依赖这一点。

提取大小

虽然使用 Cursor 可以防止 jOOQ 渴望将所有数据提取到内存中,但您的底层 JDBC 驱动程序可能仍然这样做。要在 JDBC 驱动程序中配置提取大小,请使用 ResultQuery.fetchSize(int),它在执行查询时指定 JDBC Statement.setFetchSize(int)。请参阅您的 JDBC 驱动程序手册,了解提取大小及其可能的默认值和限制。

游标附带所有其他提取功能

org.jooq.ResultQueryorg.jooq.Result 一样,org.jooq.Cursor 提供了对我们目前为止看到的所有其他提取功能的访问权限,即:

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo