I have a JOOQ query where I want to avoid materializing all Records at the same time. (However, I am fine with jointly materializing all bean objects created from them.)
I have the following simple method to load the data:
public List<CustomerInfo> getCustomers() {
return dslContext
.selectFrom(CUSTOMER)
// <-- note the missing .fetch()
.stream()
.map(CustomerInfo::new)
.collect(Collectors.toList());
}
Can this lead to a JDBC connection leak in any circumstances? (e.g. an Exception in CustomerInfo::new
)
I've tried my luck finding a way to register a reliable stream "completion" hook that fires on complete stream consumption or on any exception, but that's not possible, unfortunately: Register a Stream "completion" hook
So, indeed, the code you have shown is not correct. The correct way to operate with "lazy" streams (or
Cursor
) is to use the try-with-resources statement. The following two are equivalent:Notice also the
ResultQuery.stream()
javadoc: