질문 시나리오 Spring Batch Tasklet 안에서 slaveMapper를 사용하는 다음 코드처럼: slaveTxSupport.read(() -> slaveMapper.selectSomething());slaveTxSupport.read(() -> slaveMapper.selectAnotherThing()); 이 경우: 이 궁금증에 대한 답을 정리합니다.
결론 요약 항목 설명 TransactionTemplate.read(…) 호출마다 트랜잭션 생성됨
맞습니다 각 트랜잭션은 독립적인 커넥션 사용
맞습니다 첫 번째 호출이 끝난 시점에 커넥션 반환되는가
반환됨 더 읽기
BATCH
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 더 읽기
JVM Heap 지정 후에도 OutOfMemoryError가 발생하는 이유
문제 요약 Pod에 10Gi 제한 설정 및 JVM에 -Xms4g -Xmx6g 설정을 했음에도 불구하고 heap 메모리 부족으로 OOM 발생 원인 분석 해결 방안 일반적으로 다음 비율이 안전: Memory Limit 최대 Xmx 권장 값 (안전 범위) 10Gi -Xmx7g 또는 -Xmx8g 16Gi -Xmx12g 정도까지 20Gi -Xmx16g까지도 가능
추천 세팅 (10Gi 제한 더 읽기
Spring Batch 대용량 S3 파일 다운로드 중 OutOfMemoryError 분석
문제 요약 Tasklet 내에서 S3Client.downloadFile() 호출 중 내부적으로 Apache Commons IO의 IOUtils.toByteArray(InputStream) 사용이 대량 메모리를 점유하며 OOM 발생 원인 분석 개선 방안
Spring Batch Tasklet에서 예외 발생 시 Slave 커넥션 반환 실패 원인 분석
문제 요약 Spring Batch Tasklet 내부에서 슬레이브(readOnly) DataSource를 통해 조회를 수행 중 예외 발생 시, PlatformTransactionManager의 rollback 처리 후 커넥션이 반환되지 않는 문제가 발생하였습니다. 원인 분석 개선 방안 또는 명시적 반환 방식:
Spring Batch 작업을 Kubernetes CronJob으로 병렬 처리할 때의 고려사항과 커넥션 오류 대응 전략
1. Spring Batch를 Kubernetes CronJob에서 병렬로 실행하려는 시나리오
2. HikariCP 경고: “Apparent connection leak detected”
3. MyBatis 쿼리가 길어질 때 INSERT 타임아웃 처리 @Options(timeout = 5)void insertMyData(@Param(“list”) List<MyDto> list);
4. 커넥션 오류 예외 예시 (Unknown thread id)
5. 기존 Step을 Partitioning Step으로 전환할 수 있는가?
Spring Batch Kubernetes 종료 처리: graceful shutdown, shutdown hook, 컨테이너 runtime hang 완전 정복
Kubernetes 환경에서 sample-batch 시스템은 Java 기반의 Spring Batch Job을 실행하고 있으며, 안정적인 종료 처리가 매우 중요합니다. 특히 다음과 같은 요구사항을 만족해야 합니다: 이를 위해 다음 설정 및 코드 전략을 활용했습니다: 핵심 설정 yaml복사편집activeDeadlineSeconds: 180 terminationGracePeriodSeconds: 10
코드 전략 요약 1. Shutdown Hook에서 Whatap 처리 및 Thread 정리 Runtime.getRuntime().addShutdownHook(new 더 읽기
Spring BeanCreationNotAllowedException: Singleton Bean 생성 오류와 종료 시점 문제 해결법
1. 오류 메시지 Spring 종료 시 다음과 같은 예외가 발생할 수 있습니다: 2. 발생 시점 Spring 애플리케이션 종료 중, 별도 쓰레드 또는 병렬 처리 중에 ApplicationContext.getBean() 을 호출하는 경우에 발생합니다. 예를 들어 다음은 비동기 처리 로직 내에서 Bean을 호출한 경우입니다: 3. 주요 원인 4. 해결 방법 4.1 Bean 사전 주입 더 읽기
Spring Batch 병렬 처리 시 “Scope ‘job’ is not active” 오류 해결 방법 (Spring Boot 3 + Batch 5)
Spring Batch 병렬 처리 시 발생하는 Scope ‘job’ is not active 오류와 해결 방법 Spring Boot 3 + Spring Batch 5 환경에서 병렬 Step 처리(TaskExecutorPartitionHandler)를 구현하던 중 다음과 같은 오류가 발생할 수 있습니다: Scope ‘job’ is not active for the current threadNo context holder available for job scope 해당 오류는 더 읽기