이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 토토 결과.PostgreSQL : 문서 : 17 : 32.4. 비동기 윈 토토 처리버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

1.3. 비동기 쿼리 처리

PQexec함수는 다음에 적합합니다. 간단한 동기 애플리케이션에서 쿼리 제출. 그것은 그러나 몇 가지 주요 결함이 있습니다.

  • PQexec쿼리가 될 때까지 기다립니다. 완료되었습니다. 애플리케이션에 수행할 다른 작업이 있을 수 토토 결과(예: 사용자 인터페이스 유지), 이 경우에는 원하지 않을 것입니다. 응답을 기다리는 블록입니다.

  • 통제권이 내부에 묻혀있으니까PQexec, 프런트엔드에서 결정하기 어렵습니다. 진행 중인 쿼리를 취소하려고 합니다. (그럴수도 있지 신호 처리기에서 수행되지만 그렇지 않으면 수행되지 않습니다.)

  • PQexec하나만 반환할 수 있습니다. PGresult 구조. 제출된 쿼리 문자열에 다음이 포함된 경우 여러SQL명령, 제외한 모두 마지막 PGresult는 다음에 의해 삭제됩니다.PQexec.

이러한 제한이 마음에 들지 않는 응용 프로그램은 대신 다음과 같은 기본 함수를 사용하세요.PQexec다음에서 빌드됨:PQsendQuery그리고PQgetResult.

이 기능을 사용하는 이전 프로그램은 물론PQputline그리고PQputnbytes다음으로 데이터 보내기를 기다리는 것을 차단할 수 있습니다. 해당 문제를 해결하기 위한 백엔드 함수PQsetnonblocking추가되었습니다.

오래된 애플리케이션은 사용을 게을리할 수 있음PQsetnonblocking그리고 잠재적으로 나이가 들수록 차단 행동. 최신 프로그램에서 사용할 수 있습니다.PQset비차단완전히 달성하기 위해 백엔드에 대한 비차단 연결입니다.

  • PQsetnonblocking다음을 설정합니다 연결의 비차단 상태입니다.

    int PQsetnonblocking(PGconn *conn, int arg)
    arg가 다음인 경우 연결 상태를 비차단으로 설정합니다. TRUE, arg가 FALSE이면 차단됩니다. 정상이면 0을 반환하고, 오류이면 -1을 반환합니다.

    비차단 상태에서 호출PQputline, PQputnbytes, PQsendQuery그리고PQendcopy차단하지 않고 대신 반환합니다. 다시 호출해야 하면 오류가 발생합니다.

    데이터베이스 연결이 비차단으로 설정된 경우 모드 및PQexec호출되면, 일시적으로 연결 상태를 차단으로 설정합니다.PQexec완료합니다.

    더 많은 libpq가 안전해질 것으로 예상됩니다.PQset비차단근처에 있는 기능 미래.

  • PQis비차단다음을 반환합니다. 데이터베이스 연결의 차단 상태입니다.

    int PQisnonblocking(const PGconn *conn)
    연결이 비차단 모드로 설정된 경우 TRUE를 반환합니다. 차단하는 경우 거짓입니다.
  • PQsendQuery다음에 쿼리 제출포스트그레스기다리지 않고 결과. 쿼리가 성공적으로 수행되면 TRUE가 반환됩니다. 전달됨, 그렇지 않은 경우 FALSE(이 경우 PQerrorMessage 사용) 실패에 대한 자세한 정보를 얻으려면).

    int PQsendQuery(PGconn *conn,
                    const char *쿼리);
    성공적으로 호출한 후PQsendQuery, 전화PQgetResult쿼리를 얻기 위해 한 번 이상 결과.PQsendQuery호출될 수 없습니다 다시 (동일한 연결에서)까지PQgetResult이 NULL을 반환했으며 이는 쿼리가 완료되었습니다.
  • PQgetResult다음을 기다리세요 이전의 결과PQsendQuery, 그리고 그것을 돌려보내세요. 쿼리가 완료되면 NULL이 반환됩니다. 그러면 더 이상 결과가 나오지 않습니다.

    PGresult *PQgetResult(PGconn *conn);
    PQgetResult호출되어야 함 NULL을 반환할 때까지 반복하여 쿼리가 완료되었음을 나타냅니다. 완료. (활성 쿼리가 없을 때 호출되는 경우,PQgetResult한 번에 NULL을 반환합니다.) 각 null이 아닌 결과:PQgetResult동일한 PGresult 접근자를 사용하여 처리되어야 합니다. 이전에 설명한 기능. 각각을 해제하는 것을 잊지 마세요 결과 개체PQclear언제 그것으로 끝났습니다. 참고하세요PQgetResult쿼리가 활성화되어 있고 필요한 경우에만 차단됩니다. 응답 데이터를 아직 읽지 않았습니다.PQconsumeInput.

사용 중PQsendQuery그리고PQgetResult다음 중 하나를 해결합니다.PQexec의 문제: 쿼리 문자열에 다음이 포함된 경우 여러SQL명령, 결과 해당 명령은 개별적으로 얻을 수 토토 결과. (이것은 그런데 간단한 형태의 중첩 처리: 프런트엔드 백엔드가 작동하는 동안 하나의 쿼리 결과를 처리할 수 토토 결과. 여전히 동일한 쿼리 문자열에서 이후 쿼리를 작업 중입니다.) 그런데 전화가 왔어요PQgetResult여전히 백엔드가 다음 작업을 완료할 때까지 프런트엔드를 차단합니다.SQL명령. 이는 다음을 통해 피할 수 있습니다. 세 가지 추가 기능의 적절한 사용:

  • PQconsumeInput입력이 다음과 같은 경우 백엔드에서 사용할 수 있으므로 사용하세요.

    int PQconsumeInput(PGconn *conn);
    PQconsumeInput일반적으로 1을 반환합니다. "오류 없음"을 나타내지만 어떤 종류의 오류가 있는 경우 0을 반환합니다. 문제(이 경우PQerrorMessage입니다 설정). 결과는 입력 데이터가 있는지 여부를 나타내지 않습니다. 실제로 수집되었습니다. 통화 후PQconsumeInput, 애플리케이션이 확인할 수 토토 결과PQisBusy및/또는PQ알림상태가 변경되었는지 확인합니다.

    PQconsumeInput호출될 수 있음 애플리케이션이 결과를 처리할 준비가 되어 있지 않더라도 또는 아직 알림이 없습니다. 루틴을 읽을 수 있습니다. 데이터를 버퍼에 저장하여 다음과 같은 오류가 발생합니다.선택(2) 읽기 준비 표시가 사라집니다. 따라서 애플리케이션은 다음을 사용할 수 있습니다.PQconsumeInput삭제하려면선택즉시 조건을 설정한 다음 여유롭게 결과를 검토해 보세요.

  • PQisBusy쿼리가 다음과 같은 경우 1을 반환합니다. 바쁘다, 즉,PQgetResult아마도 입력을 기다리는 블록입니다. 0 반환은 다음을 나타냅니다.PQgetResult다음을 보장하여 호출할 수 있습니다. 차단하지 않습니다.

    int PQisBusy(PGconn *conn);
    PQisBusy자체는 시도하지 않을 것입니다 백엔드에서 데이터를 읽습니다. 그러므로PQconsumeInput먼저 호출되어야 합니다. 그렇지 않으면 사용 중입니다. 상태는 결코 끝나지 않을 것입니다.
  • PQflush플러시를 시도합니다. 백엔드에 대기 중인 데이터는 성공하면 0을 반환합니다(또는 전송 큐가 비어 있음) 또는 일부 실패한 경우 EOF 이유.

    int PQflush(PGconn *conn);
    PQ플러시다음에 호출되어야 합니다. 전화하기 전에 비차단 연결선택응답이 도착했는지 확인합니다. 0이면 반환되어 백엔드에 대기 중인 데이터가 없는지 확인합니다. 실제로 전송되지 않은 것입니다. 사용한 애플리케이션만PQset비차단이것이 필요합니다.
  • PQsocket파일 획득 백엔드 연결 소켓의 설명자 번호입니다. 유효한 설명자는 = 0입니다. -1의 결과는 없음을 나타냅니다. 백엔드 연결이 현재 열려 있습니다.

    int PQsocket(const PGconn *conn);
    PQsocket얻는 데 사용해야 합니다. 실행을 준비하는 백엔드 소켓 설명자선택(2). 이를 통해 응용 프로그램이 허용됩니다. 차단 연결을 사용하여 백엔드 응답을 기다리거나 다른 조건. 결과가 다음과 같다면선택(2)는 다음에서 데이터를 읽을 수 있음을 나타냅니다. 백엔드 소켓, 그런 다음PQconsumeInput19717_19768PQisBusy, PQgetResult, 및/또는PQ알림처리하는 데 사용할 수 토토 결과. 응답.

    비차단 연결(사용된)PQset비차단)를 사용하면 안 됩니다선택까지PQ플러시다음이 있음을 나타내는 0을 반환했습니다. 백엔드로 전송되기를 기다리는 버퍼링된 데이터가 없습니다.

이러한 기능을 사용하는 일반적인 프런트엔드는 메인 루프를 갖습니다. 을 사용하는선택(2) 모든 것을 기다리기 위해 응답해야 하는 조건입니다. 조건 중 하나는 다음과 같습니다. 백엔드에서 사용할 수 있는 입력입니다.선택의 용어는 파일에서 읽을 수 있는 데이터입니다. 다음으로 식별되는 설명자PQsocket. 언제 메인 루프가 입력 준비를 감지하면 호출해야 합니다.PQconsumeInput입력을 읽습니다. 그러면 가능하다 전화PQisBusy, 이어서PQgetResultifPQisBusy거짓(0)을 반환합니다. 전화할 수도 토토 결과.PQ알림NOTIFY 메시지를 감지합니다(참조 '비동기 알림'(아래).

다음을 사용하는 프런트엔드PQsendQuery/PQgetResult아직 처리 중인 쿼리를 취소하려고 시도할 수도 토토 결과. 백엔드에서.

  • PQ요청취소요청하세요포스트그레스포기 처리 현재 쿼리 중 하나입니다.

    int PQrequestCancel(PGconn *conn);
    취소 요청이 성공적으로 이루어지면 반환 값은 1입니다. 발송됨, 그렇지 않은 경우 0 (그렇지 않다면,PQerrorMessage그 이유를 알려줍니다.) 성공적인 파견 그러나 요청이 효과가 있다는 보장은 없습니다. 반환 값에 관계없이PQ요청취소, 애플리케이션은 다음과 같이 계속되어야 합니다. 다음을 사용하는 일반적인 결과 읽기 시퀀스PQgetResult. 취소가 유효한 경우, 현재 쿼리가 일찍 종료되고 오류를 반환합니다. 결과. 취소가 실패하는 경우(예: 백엔드가 쿼리 처리가 이미 완료되었습니다). 전혀 눈에 띄는 결과가 없습니다.

현재 쿼리가 트랜잭션의 일부인 경우, 취소하면 전체 거래가 중단됩니다.

PQ요청취소안전하게 할 수 있어요 신호 처리기에서 호출됩니다. 그래서 활용도 가능해요 일반과 함께PQexec, 만약 취소 결정은 신호 처리기에서 이루어질 수 토토 결과. 에 대한 예psql호출PQ요청취소SIGINT 신호 처리기에서, 따라서 발행된 쿼리를 대화형으로 취소할 수 토토 결과. 통해PQexec. 참고하세요PQ요청취소다음과 같은 경우에는 아무런 효과가 없습니다. 연결이 현재 열려 있지 않거나 백엔드가 현재 열려 있지 않습니다. 쿼리를 처리하는 중입니다.