2013-08-02 2 views
6

저는 PostgreSQL 8.3을 사용 중이며 libpq API를 사용하는 C++ 프로그램을 작성하고 있습니다. PQsendQuery() 함수와 비동기 적으로 명령을 실행합니다. 시간 초과 처리 기능을 구현하려고합니다. 타임 아웃이 만료되면 PQcancel()을 호출하여 구현했습니다. 나는 1 밀리 초의 타임 아웃으로 100 000 행 (약 0.5 초 지속)을 반환하는 쿼리를 테스트하여 서버가 실행을 완료 할 때까지 PQcancel() 블록을 차단 한 다음 성공적인 쿼리를 반환한다는 것을 알았습니다.PostgreSQL : C/C++ 프로그램에서 쿼리 취소

문서에 성공적인 취소 요청이 있어도 쿼리가 여전히 실행될 수 있다고 나와 있습니다. 내 문제는 PQcancel() 내 실행 스레드를 차단하는 것입니다. 비동기 처리 (Boost Asio 프레임 워크 사용) 때문에 SQL 쿼리를 실행하는 것보다 다른 작업을 할 수있는 프로그램이 하나의 스레드에서만 실행되므로 허용되지 않습니다. .

정상적으로 PQcancel()이 차단됩니까? 비 차단 취소 요청을하는 방법이 있습니까?

+2

사이드 노트 : 8.3 버전은 지원되지 않습니다. 지원되는 버전 중 하나로 업데이트하는 것이 좋습니다. –

+0

내가 사용하는 Linux 배포판 (SUSE 11)에서 제공되는 버전입니다. – petersohn

+1

배송 방법은 중요하지 않습니다. 그것은 아직 구식이다. –

답변

2

PQcancel의 구현을 살펴 보았습니다. 그것은 서버에 대한 별도의 TCP 연결을 만듭니다. 이것이 차단 이유입니다. 이 코드 부분은 PostgreSQL의 최신 버전에서도 똑같습니다. 그래서 나는 별도의 스레드에서 취소를 시작하는 것 이외의 방법으로 차단을 해제 할 방법이 없다고 결론을 내 렸습니다. 취소 객체가 연결 객체와 완전히 독립적이므로이 객체를 완전히 안전하게 사용할 수 있으므로이 기능을 사용하는 것이 좋습니다.

0

차단 연결에서이 작업을하는 것처럼 들립니다. 문서에서 PQsetnonblocking을 확인하고 연결을 non-blocking으로 설정하면 PQCancel을 즉시 반환 할 수 있어야합니다. 그러나 또한 연결에 대한 모든 작업을 비 차단으로 만듭니다.