【问题标题】:Does JdbcCursorItemReader have to close connection?JdbcCursorItemReader 是否必须关闭连接?
【发布时间】:2020-03-16 20:31:52
【问题描述】:

Spring Batch 文档中有一个示例 (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 是否必须手动关闭连接?

【问题讨论】:

  • 你没有,而且你的JdbcCursorItemReader 的使用很奇怪。您通常不会自己阅读,而是让 Spring Batch 做到这一点。关闭也没有意义。所以我不确定你想在这里做什么。

标签: spring spring-batch


【解决方案1】:

您链接的参考文档中的 sn-p 解释了事情是如何在幕后工作的,但是当读者在面向块的步骤中使用时,您不需要自己调用 open/close 方法,Spring Batch 会做它。所以你的项目阅读器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;
}

【讨论】:

  • 使用tasklet方式时需要关闭连接吗?对于我的示例,如何将 itemReader 传递给 List ?或者,我如何将 itemReader 打印到日志中,因为我想看看 JdbcCursorItemReader 在春季批处理中是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2011-06-15
  • 1970-01-01
相关资源
最近更新 更多