Java 8 在try-with-resources块之外对JOOQ结果进行流式处理时,我是否有JDBC连接泄漏的风险?

Java 8 在try-with-resources块之外对JOOQ结果进行流式处理时,我是否有JDBC连接泄漏的风险?,java-8,java-stream,jooq,autocloseable,Java 8,Java Stream,Jooq,Autocloseable,我有一个JOOQ查询,希望避免同时具体化所有记录。(不过,我可以联合具体化所有由它们创建的bean对象。) 我有以下加载数据的简单方法: public List<CustomerInfo> getCustomers() { return dslContext .selectFrom(CUSTOMER) // <-- note the missing .fetch() .str

我有一个JOOQ查询,希望避免同时具体化所有记录。(不过,我可以联合具体化所有由它们创建的bean对象。)

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

public List<CustomerInfo> getCustomers() {
    return dslContext
                .selectFrom(CUSTOMER)
                // <-- note the missing .fetch()
                .stream()
                .map(CustomerInfo::new)
                .collect(Collectors.toList());
}
public List getCustomers(){
返回上下文
.从(客户)中选择

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

因此,实际上,您显示的代码是不正确的。使用“惰性”流(or)的正确方法是使用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());
}
//使用流
try(Stream=dslContext.selectFrom(CUSTOMER.Stream()){
return stream.map(CustomerInfo::new).collect(Collectors.toList());
}
//使用光标
try(Cursor Cursor=dslContext.selectFrom(CUSTOMER.fetchLazy()){
返回cursor.stream().map(CustomerInfo::new).collect(Collectors.toList());
}
还要注意javadoc:

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