JdbcCursorItemReader 是否必须关闭连接?

Does JdbcCursorItemReader have to close connection?

有一个示例来自 Spring 批处理文档 (https://docs.spring.io/spring-batch/docs/4.2.x/reference/html/readersAndWriters.html#cursorBasedItemReaders)

public ItemReader<RevertedBillCredit> verifyCreditReader() {     
        JdbcCursorItemReader itemReader = new JdbcCursorItemReader();
        itemReader.setDataSource(dataSource);
        itemReader.setSql("SELECT ID, NAME, CREDIT from CUSTOMER");
        itemReader.setRowMapper(new CustomerCreditRowMapper());
        int counter = 0;
        ExecutionContext executionContext = new ExecutionContext();
        itemReader.open(executionContext);
        Object customerCredit = new Object();
        while(customerCredit != null){
            customerCredit = itemReader.read();
            counter++;
        }
        itemReader.close();
    }

我发现有些文档说JdbcCursorItemReader会在查询后自动关闭连接。但是,为什么我们在这里需要 itemReader.close() 呢? JdbcCursorItemReader 是否必须手动关闭连接?

您链接的参考文档中的片段解释了幕后的工作原理,但是当 reader 在面向块的步骤中使用时,您不需要调用 open/close 方法你自己,Spring批处理就可以了。所以你的项目 reader bean 定义应该是这样的:

public ItemReader<RevertedBillCredit> verifyCreditReader() {     
    JdbcCursorItemReader itemReader = new JdbcCursorItemReader();
    itemReader.setDataSource(dataSource);
    itemReader.setSql("SELECT ID, NAME, CREDIT from CUSTOMER");
    itemReader.setRowMapper(new CustomerCreditRowMapper());
    return itemReader;
}