9

我有一个 JOOQ 查询,我想避免同时实现所有记录。(但是,我可以共同实现从它们创建的所有 bean 对象。)

我有以下简单的方法来加载数据:

public List<CustomerInfo> getCustomers() {
    return dslContext
                .selectFrom(CUSTOMER)
                // <-- note the missing .fetch()
                .stream()
                .map(CustomerInfo::new)
                .collect(Collectors.toList());
}

这会在任何情况下导致 JDBC 连接泄漏吗?(例如 中的异常CustomerInfo::new

4

1 回答 1

8

我试过我的运气找到一种方法来注册一个可靠的流“完成”钩子,该钩子在完整的流消耗或任何异常时触发,但不幸的是,这是不可能的:注册一个流“完成”钩子

因此,确实,您显示的代码不正确。使用“惰性”流(或Cursor)操作的正确方法是使用 try-with-resources 语句。以下两个是等价的:

// Using a Stream
try (Stream<CustomerRecord> stream = dslContext.selectFrom(CUSTOMER).stream()) {
    return stream.map(CustomerInfo::new).collect(Collectors.toList());
}

// Using a Cursor
try (Cursor<CustomerRecord> cursor = dslContext.selectFrom(CUSTOMER).fetchLazy()) {
    return cursor.stream().map(CustomerInfo::new).collect(Collectors.toList());
}

还要注意ResultQuery.stream()javadoc:

这与 fetchLazy() 基本相同,但不是返回 Cursor,而是返回 Java 8 Stream。客户端应确保正确关闭 Stream,例如在 try-with-resources 语句中

于 2016-02-22T17:34:17.207 回答