
JDBC setReadOnly 호출 이슈 해결기
두줄요약
AWS JDBC 래퍼의 topology 쿼리와 `setReadOnly` 호출이 겹쳐 발생한 간헐 오류를 분석했습니다. 읽기 전용 DataSource를 분리 설정해 readOnly 전환을 피하도록 해결했습니다.
문제 상황
- AWS Advanced JDBC Wrapper와 Aurora PostgreSQL 환경에서 불특정 조회 API의
setReadOnly간헐 오류 - 트랜잭션 시작·종료 과정에서
Cannot change transaction read-only property in the middle of a transaction발생
원인 분석
- Failover 플러그인의 topology 캐시 만료 시 클러스터 상태 확인 쿼리 실행
- topology 쿼리로 PostgreSQL JDBC
TransactionState가OPEN으로 바뀐 뒤setReadOnly호출 LazyConnectionDataSourceProxy와 Spring 트랜잭션 종료 리셋 과정의 readOnly 전환 동작
해결 방법
LazyConnectionDataSourceProxy.setReadOnlyDataSource로 읽기 전용 DataSource 설정- 읽기 전용 커넥션 풀의 기본
readOnly=true활용으로 트랜잭션 시작·종료 시setReadOnly전환 회피 @Transactional(readOnly = true)에 따른 쓰기·읽기 DataSource 분기 적용
주의할 점
- topology 쿼리 실행과 readOnly 전환, 캐시 만료 조건이 겹칠 때만 재현되는 간헐적 오류
- 라이브러리 호출 스택과 조건부 중단점, 부하 테스트를 통한 시작·종료 시점별 검증 필요




