목록 보기
JDBC setReadOnly 호출 이슈 해결기
백엔드

JDBC setReadOnly 호출 이슈 해결기

인프런
인프런
2024년 9월 1일

두줄요약

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 전환, 캐시 만료 조건이 겹칠 때만 재현되는 간헐적 오류
  • 라이브러리 호출 스택과 조건부 중단점, 부하 테스트를 통한 시작·종료 시점별 검증 필요

다음 읽기

#Spring Boot 주제를 다룬 다른 회사 글

Aurora MySQL의 숨겨진 idle close 동작 — HikariCP "Failed to validate connection" 추적기

Aurora MySQL에서 HikariCP의 idle connection 검증 실패 원인을 추적해 비표준 timeout 동작을 확인했습니다. interactive_timeout 이 keepalive 보다 작으면 비활성 연결이 먼저 끊길 수 있음을 정리했습니다.

여기어때
여기어때
백엔드

댓글 0개

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...