postgresql 9.2 / C++(MFC) / libpq 사용중입니다.
libpq 함수중에 IsConnection 으로 연결상태를 체크했는데,
// ConnStatusType Status = PQStatus(m_pConn);
네트워크가 물리적으로 단선되었을때 해당 함수에서 CONNECTION_OK 를 리턴합니다.
이럴때는 어떻게 검사하는게 좋을까요?
제가 코딩한다면 CONNECTION 체크시,
"SELECT 1" 이런 간단한 쿼리를 실제 수행해볼것 같습니다.
SELECT 1 쿼리 수행시 연결상태일떄와 비연결상태일때 어떤식으로 데이터가 오나요?
모든 서버 - 클라이언트 간 통신이 원활한가?를 검사하는 방법은
비동기식으로 timeout 값을 주고, 해당 서버 - 클라이언트간 사용하는 가장 적은 비용의
요청 - 응답을 확인하는 것입니다. (비동기식 timeout 값이 지정된 쿼리를 사용해야지 위와 같은 클라이언트가 세션 종료 신호를 보내지 않고 연결이 끊겨 버린 것에 대한 감지 시간을 최소화 할 수 있습니다. 최악의 경우는 서버 쪽에서는 그 해당 클라이언트 소켓을 서버 재실행하기 전까지 연결이 유효한 소켓이라고 판단하기도 합니다)
어떤 것도 믿으면 안됩니다. :)
성식님처럼 직접 쿼리를 보내고, 그 응답이 오는지를 확인하는 것이 제일 확실합니다.
좀 비용이 더 들지만, 서버가 분벼서 쿼리를 수행할 수 없을 정도에 대해서도 어떤 조치를 취하려고 검사를 한다면, 이 때는 어느 정도 디스크 I/O가 발생하는 쿼리를 이용하는 것이 좋겠죠.