JDBC setReadOnly 호출 이슈 해결기
·2024.09.02 06:00
AWS Aurora JDBC 래퍼 드라이버가 트랜잭션 종료 시 실행하는 topology 쿼리로 인해 발생하는 setReadOnly 에러를 분석했다.
인프랩의 JVM 서버 운영 중 핀포인트(Pinpoint)를 통해 **'Cannot change transaction read-only property in the middle of a transaction'**이라는 에러가 간헐적으로 발생하는 문제를 확인했다.
분석 결과, 에러는 트랜잭션 종료 시점에 PostgreSQL JDBC 드라이버 내부에서 발생했다. 원인은 AWS JDBC 래퍼 드라이버가 제공하는 Failover Plugin에 있었다.
이 플러그인은 클러스터 상태를 확인하기 위해 aurora_replica_status() 함수를 사용하는 topology 쿼리를 실행한다. 문제는 트랜잭션이 종료되어 상태가 IDLE로 변하는 시점에 이 쿼리가 실행되면서 트랜잭션 상태가 다시 OPEN으로 변경되고, 이후 setReadOnly가 호출되어 충돌이 발생하는 구조였다.
가장 간단한 해결책은 래퍼 드라이버를 제거하는 것이지만, 높은 가용성을 위해 Fast Failover 기능이 필요한 상황이므로 근본적인 원인 파악과 적절한 설정 최적화가 필요하다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.