Java 8 在try-with-resources块之外对JOOQ结果进行流式处理时,我是否有JDBC连接泄漏的风险?
我有一个JOOQ查询,希望避免同时具体化所有记录。(不过,我可以联合具体化所有由它们创建的bean对象。) 我有以下加载数据的简单方法: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
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语句中