문제 현상
원인 분석
해결 방법
적용 후 기대 효과
커넥션 누수
Spring Batch Tasklet 트랜잭션 내 개별 항목 실패 시 커넥션 누수 방지 방법
문제 요약 Tasklet 내부에서 루프를 돌며 개별 항목을 처리할 때, 예외가 발생해도 catch 블럭 내에서 로그만 찍고 다음 항목으로 진행하는 방식은 커넥션 반환이 제대로 되지 않아 HikariCP 커넥션 풀에서 누수가 발생할 수 있음. 개선 방안 예제 코드 예외 발생 시 명시적 커넥션 반환 효과
Spring Batch Tasklet에서 slave DB를 여러 번 호출할 때 커넥션은 각각 반환되는가?
질문 시나리오 Spring Batch Tasklet 안에서 slaveMapper를 사용하는 다음 코드처럼: slaveTxSupport.read(() -> slaveMapper.selectSomething());slaveTxSupport.read(() -> slaveMapper.selectAnotherThing()); 이 경우: 이 궁금증에 대한 답을 정리합니다.
결론 요약 항목 설명 TransactionTemplate.read(…) 호출마다 트랜잭션 생성됨
맞습니다 각 트랜잭션은 독립적인 커넥션 사용
맞습니다 첫 번째 호출이 끝난 시점에 커넥션 반환되는가
반환됨 더 읽기
Spring Batch에서 slave DB 커넥션 반환 문제와 MyBatis + Hikari 트랜잭션 실전 가이드
문제 인식
핵심 원인
해결 방법
1. TransactionTemplate으로 slave 트랜잭션 분리 List<Data> list = slaveTxSupport.read(() -> slaveMapper.selectByCondition(paramA, paramB));
2. chunk 방식에서 ListItemReader에 적용 가능 @Bean@StepScopepublic ListItemReader<Entity> reader() { return new ListItemReader<>( slaveTxSupport.read(() -> mapper.selectList(param)) );}
3. 커넥션 반환 여부 확인
MyBatis Interceptor에서 커넥션 더 읽기
Spring Batch에서 다중 DataSource 환경에서의 커넥션 누수 방지와 안정적인 트랜잭션 처리 방법
문제 배경 대규모 배치 시스템에서 master/slave로 분리된 DB 환경을 사용하는 경우,하나의 Step 내에서 slave로부터 읽고, master에 쓰는 구조가 필요하다.그러나 잘못된 트랜잭션 구성으로 인해 slave의 커넥션이 반환되지 않고 누수(leak)되는 문제가 발생할 수 있다.
해결 전략
핵심 코드 예시 ① 트랜잭션 분리용 유틸 컴포넌트 @Componentpublic class SampleSlaveTransactionSupport { private 더 읽기