JdbcBatchItemWriter Query
안녕하세요 선생님!
JdbcBatchItemWriter 에서 발생하는 Query 가
batch query 로 나가지 않는 것 같아서 질문 드립니다!
혹시 jdbc 에서 batch query 로 보내더라도 optimizer 에 의해
단일쿼리로 변경되어서 나갈수도 있나요?!
감사합니다.
위 사진은 MySQL 의 Query Log 입니다.
제 설정은 아래와 같습니다
@Configuration
class HelloJobConfiguration(
private val jobBuilderFactory: JobBuilderFactory,
private val stepBuilderFactory: StepBuilderFactory,
private val dataSource: DataSource,
) {
@Bean
fun job(): Job {
return jobBuilderFactory.get("job")
.incrementer(RunIdIncrementer())
.start(step1())
.build()
}
@Bean
fun step1(): Step {
return stepBuilderFactory.get("step1")
.chunk<Customer, Customer>(5)
.reader(customItemReader())
.writer(customItemWriter())
.build()
}
@Bean
fun customItemReader(): ItemReader<Customer> {
return JdbcPagingItemReaderBuilder<Customer>()
.name("jdbcPagingItemReader")
.dataSource(dataSource)
.pageSize(5)
.rowMapper(BeanPropertyRowMapper(Customer::class.java))
.queryProvider(queryProvider())
.build()
}
@Bean
fun queryProvider(): PagingQueryProvider {
return SqlPagingQueryProviderFactoryBean().apply {
setDataSource(dataSource)
setSelectClause("SELECT id, firstName, lastName, birthdate")
setFromClause("FROM customer")
setSortKeys(mapOf("id" to Order.ASCENDING))
}.`object`
}
@Bean
fun customItemWriter(): ItemWriter<Customer> {
return JdbcBatchItemWriterBuilder<Customer>()
.dataSource(dataSource)
.sql("INSERT INTO customer2 values(:id, :firstName, :lastName, :birthdate);")
.beanMapped()
.build()
}
}
답변 1
1
네
쿼리가 콘솔에 나오더라도 내부적으로 배치 형태로 업데이트 된다 보시면 됩니다.
실제로 내부 소스를 보시면 jdbctemplate.batchupdate(query).... 와 같이 되어 있습니다.
if (usingNamedParameters) {
if(items.get(0) instanceof Map && this.itemSqlParameterSourceProvider == null) {
updateCounts = namedParameterJdbcTemplate.batchUpdate(sql, items.toArray(new Map[items.size()]));
} else {
SqlParameterSource[] batchArgs = new SqlParameterSource[items.size()];
int i = 0;
for (T item : items) {
batchArgs[i++] = itemSqlParameterSourceProvider.createSqlParameterSource(item);
}
updateCounts = namedParameterJdbcTemplate.batchUpdate(sql, batchArgs);
}
}
else {
updateCounts = namedParameterJdbcTemplate.getJdbcOperations().execute(sql, new PreparedStatementCallback<int[]>() {
@Override
public int[] doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {
for (T item : items) {
itemPreparedStatementSetter.setValues(item, ps);
ps.addBatch();
}
return ps.executeBatch();
}
});
}보시면
namedParameterJdbcTemplate.batchUpdate(sql, batchArgs)ps.addBatch();
ps.executeBatch()와 같이 되어 있습니다.
스프링 배치 버전 질문
0
122
1
소스코드가 어디에 있나요?
0
96
2
트랜잭션 예외
0
92
1
질문이 있습니다.
0
130
2
ChunkListener 에서 beforeChunk 의 실행 시점 관련 질문
0
125
2
여러 JOB 설정하는법
0
150
2
강의 자료 다른 방법 있을까요?
0
154
1
JobExecution과 JobExecutionContext와의 관계
0
186
2
특정 job만 실행
1
252
1
Batch 성능 질문
0
153
1
ItemReaderAdapter 종료
0
80
1
[ 강좌 Git 브랜치 문의 ] 섹션 9 > JdbcCursorItemReader, JpaCursorItemReader
0
179
2
Spring Batch 배포 질문
0
246
2
spring batch 버전
0
236
2
retry count 관련 질문
0
172
2
StepExecutionListener 의 afterStep 에서 return ExitStatus.FAILED 에 의한 동작에 의문이 갑니다.
0
330
2
jdbc, jpa 커서방식 조회 방식 차이 질문 (강사님께 답변 받고 싶습니다)
0
235
2
Multithread step과 AsyncItemProcessor
0
203
2
job 재실행
0
251
2
bean 생명주기 문제 도와주세요(@Scope("step"), @Autowired)
0
183
1
Multi-threaded-step과 Partitioning 차이 확인
0
175
2
jdbcCursorReader, jdbcPagingReader 질문
0
146
1
step muti-thread 질문
0
111
1
itemSteam open update close 질문
0
112
1





