【问题标题】:Does every job call in Spring Batch open a new database connection pool?Spring Batch 中的每个作业调用是否都会打开一个新的数据库连接池?
【发布时间】:2021-01-11 08:56:49
【问题描述】:

我正在使用 JDBC 模板从数据库中查询行,对于每一行,我正在以编程方式运行一个作业,该作业执行基于块的步骤。我担心每个工作调用都会创建一组新的连接池。它是创建一组新的连接池还是只连接到当前池?

主要方法(为每个商店运行作业):

public static void main(String[] args) throws JobExecutionAlreadyRunningException, JobRestartException,
    JobInstanceAlreadyCompleteException, JobParametersInvalidException {

SpringApplication app = new SpringApplication(MainApp.class);
ConfigurableApplicationContext ctx = app.run(args);

JobLauncher jobLauncher = ctx.getBean(JobLauncher.class);
Job job = ctx.getBean("customerJob", Job.class);

storeRepository = ctx.getBean(StoreRepository.class);
customerRepository = ctx.getBean(CustomerRepository.class);

List<Store> stores = storeRepository.findAll(); 


for (Store store: stores) {
    int customerCount = customerRepository.countCustomer(store.getStoreID(), reportDate);
    System.out.println("Count: "+ customerCount);
    if (customerCount != 0) {
    JobParameters jobParameters = new JobParametersBuilder()
        .addString("reportDate", reportDate)
        .addString("ID", store.getStoreID())
        .toJobParameters();
    JobExecution jobExecution = jobLauncher.run(job, jobParameters);
    BatchStatus batchStatus = jobExecution.getStatus();
    System.out.println("Batch Status " + batchStatus);
    }
    

}
}

批处理作业配置:

@Bean
public Step generateReport() throws Exception {
return this.stepBuilderFactory
    .get("generateReport")
    .<Customer, Customer>chunk(10)
    .reader(itemReader(null, null))
    .writer(itemWriter())
    .build();
}

@Bean
public Job customerReportJob() throws Exception {
return this.jobBuilderFactory
    .get("customerReportJob")
    .start(generateReport())
    .build();
}

存储库:

@Repository
public class CustomerRepositoryImpl implements CustomerRepository {

private final JdbcTemplate jdbcTemplate;

@Autowired
    public CustomerRepositoryImpl(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}

@Override
public List<Customer> findByIDAndReportDate(String ID, String reportDate) {
String sqlQuery = "SELECT * " +  
    "FROM CUSTOMER_REPORT " +
    "WHERE ID = " +  ID + "  " +
    "AND TO_CHAR(REPORT_DATE, 'MM/DD/YYYY') = '" + reportDate + "'";

return jdbcTemplate.query(sqlQuery, 
    (rs, rowNum) -> 
    new Customer(mapper(rs)));
}
}

application.properties:

# Oracle settings
spring.datasource.url=##
spring.datasource.username=##
spring.datasource.password=##
spring.datasource.driver-class-name=##

# Hikari
spring.datasource.hikari.maximum-pool-size=5
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.idleTimeout=30000

logging.level.com.zaxxer.hikari=debug

# Spring Batch
spring.batch.job.enabled=false

【问题讨论】:

  • 不,莱斯特,它没有。如果您有一个具有默认范围(Singleton)的 Datasource bean,那么它不会为每个块创建新的连接池。
  • 嗨@Faraz,每个工作电话怎么样?每次作业后连接是否会自动关闭?会有连接泄漏的可能吗?
  • 这取决于 bean 范围。作业之间是否共享连接池?请分享您的代码,以便能够有效地帮助您。
  • 除非你在做奇怪的事情,否则我希望你有一个单一的数据源,所以它不会重复创建一个新的连接池。但是,在没有看到实际代码和配置的情况下,我们无法确定这一点。
  • 嗨@MahmoudBenHassine,我添加了代码。谢谢。

标签: java spring-boot jdbc spring-batch jdbctemplate


【解决方案1】:

根据您的配置,您的作业将使用相同的数据源/连接池。您应该能够通过查看日志来确认这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2012-10-23
    • 2011-05-04
    • 2018-11-06
    • 2016-12-19
    相关资源
    最近更新 更多