#java #spring-boot #jdbc #spring-batch #jdbctemplate
#java #spring-boot #jdbc #spring-batch #jdbctemplate
Вопрос:
Я запрашиваю строки из базы данных, используя шаблон 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
Комментарии:
1. Нет, Лестер, это не так. Если у вас есть один компонент источника данных с областью действия по умолчанию (одноэлементный), то он не создает новый пул подключений для каждого блока.
2. Привет @Faraz, как насчет каждого вызова задания? Закрываются ли соединения автоматически после каждого задания? Будет ли вероятность утечки соединения?
3. Это зависит от областей компонента. Является ли пул подключений общим для заданий? Пожалуйста, поделитесь своим кодом, чтобы он мог эффективно помочь вам.
4. Если вы не делаете странных вещей, я бы ожидал, что у вас есть один источник данных, поэтому он не будет повторно создавать новый пул подключений. Однако, не видя фактического кода и конфигурации, мы не можем быть в этом уверены.
5. Привет @MahmoudBenHassine, я добавил код. Спасибо.
Ответ №1:
В соответствии с вашей конфигурацией ваши задания будут использовать один и тот же пул источников данных / подключений. Вы должны быть в состоянии подтвердить это, просмотрев журналы.