source

Azure에서 Amazon RDS의 Postgres 데이터베이스에 연결하는 시간 초과

manycodes 2023. 7. 10. 22:30
반응형

Azure에서 Amazon RDS의 Postgres 데이터베이스에 연결하는 시간 초과

데이터베이스 연결을 일정 시간 유휴 상태로 두면 응용 프로그램에서 다음 예외가 발생합니다.

... An I/O error occured while sending to the backend.; nested exception is org.postgresql.util.PSQLException: An I/O error occured while sending to the backend.] with root cause

    java.net.SocketException: Operation timed out
        at java.net.SocketInputStream.socketRead0(Native Method)

psql에서도 동일한 문제가 발생하고 로컬 데이터베이스에 연결하는 데 문제가 없기 때문에 RDS에 문제가 있다고 확신합니다.

psql=> select 'ok';
SSL SYSCALL error: Operation timed out
psql=> select 'ok';
SSL SYSCALL error: EOF detected
The connection to the server was lost. Attempting reset: Succeeded.

저는 상황을 개선하는 작업을 제안하는 다른 질문을 발견했지만 해결하지 못했습니다(타임아웃은 이제 훨씬 더 오래 걸립니다).

JDBC(톰캣 연결 풀링) 및 JDB와 함께 Spring Boot을 사용하고 있습니다.CT 템플릿.

주변에 해결책이나 해결책이 있습니까?연결 풀을 강제로 테스트하고 다시 연결하는 것입니까?이 환경에서 어떻게 해야 합니까?

편집: 내 연결 문자열입니다.

jdbc:postgresql://myhost.c2estvxozjm3.eu-west-1.rds.amazonaws.com/dashboard?tcpKeepAlive=true

솔루션:

선택한 답변에 제시된 대로 RDS 서버 측 TCP_KeepAlive 매개 변수를 편집했습니다.사용하는 매개 변수는 다음과 같습니다.

tcp_keepalives_count      5
tcp_keepalives_idle     200
tcp_keepalives_interval 200

연결 추적 기능은 마치 연결 추적 기능인 것처럼 보이지만, 잠시 후에는 연결을 잊어버립니다.

TCP 킵얼라이브를 활성화하는 것이 좋습니다.AWS RDS 구성에서 서버 측을 사용하도록 설정할 수 있으며, 그렇지 않은 경우 JDBC 드라이버에서 클라이언트 측을 요청할 수 있습니다.

TCP 킵얼라이브는 오버헤드가 훨씬 낮고 서버 쿼리 로그에 불필요한 로그 스팸이 발생하지 않기 때문에 검증/테스트 쿼리보다 훨씬 좋습니다.

시도해 보세요

spring.datasource.validation-query=SELECT 1
spring.datasource.test-on-borrow=true

(참조)AbstractDataSourceConfiguration다른 옵션의 경우.)

연결 문자열에 포트도 포함합니까 아니면 끝점만 포함합니까?연결 문자열에서 전체 끝점을 사용해 보십시오.또한 RDS 인스턴스에 할당된 Security Group에 올바른 포트와 Inbound CIDR이 정의되어 있는지 확인합니다.

언급URL : https://stackoverflow.com/questions/22696745/timeouts-connecting-to-a-postgres-database-on-amazon-rds-from-azure

반응형