JDBC setReadOnly 에러, 래퍼 드라이버와 Spring의 만남
Spring Boot 환경에서 JDBC setReadOnly 호출 에러가 간헐적으로 발생함
AWS JDBC 래퍼 드라이버의 topology 쿼리 실행과 트랜잭션 종료 시점의 충돌이 원인
LazyConnectionDataSourceProxy의 setReadOnlyDataSource 설정을 통해 문제 해결
에러 발생 원인: 래퍼 드라이버와 트랜잭션
문제는 AWS JDBC 래퍼 드라이버가 topology 쿼리를 실행하는 시점과 트랜잭션 종료 과정에서 발생한다. 구체적으로, 래퍼 드라이버는 failover를 위해 클러스터 상태를 확인하고, 이 과정에서 setReadOnly 호출 시점에 문제가 발생한다. 따라서, 데이터베이스 연결 설정과 트랜잭션 관리의 상호작용에 대한 이해가 필요하다.
LazyConnectionDataSourceProxy의 역할과 해결책
LazyConnectionDataSourceProxy는 커넥션 생성을 지연시키고, readOnly 옵션에 따라 DataSource를 분기한다. 반면, setReadOnlyDataSource 설정을 통해 읽기 전용 DataSource를 지정하여 문제를 해결한다. 따라서, 트랜잭션 readOnly 설정과 DataSource 분리를 통해 성능 저하 없이 문제를 해결할 수 있다.
실전 적용 가이드: 설정 및 디버깅
문제 해결을 위해 setReadOnlyDataSource 설정을 적용하고, readOnly 옵션을 활용하여 DataSource를 분리한다. 구체적으로, 쓰기 인스턴스와 읽기 인스턴스를 분리하여 각기 다른 DataSource를 사용한다. 따라서, 디버깅을 통해 문제 발생 지점을 정확히 파악하고, 설정 변경 후 테스트를 진행해야 한다.