이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 토토 결과PostgreSQL : 문서 : 17 : 32.4. 비동기 윈 토토 처리버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

1.3. 비동기 쿼리 처리

thePQEXEC함수는 적합합니다 간단한 동기 응용 프로그램에서 쿼리 제출. 그것은 토토 결과 그러나 몇 가지 주요 결함이 있지만 :

  • PQEXEC쿼리가 될 때까지 기다립니다 완전한. 응용 프로그램은 다른 작업을 수행 할 수 토토 결과 (예 : 사용자 인터페이스 유지),이 경우에는 원하지 않습니다. 응답을 기다리는 차단.

  • 컨트롤이 내부에 묻혀 있기 때문에PQEXEC, 프론트 엔드가 결정하기가 어렵습니다 진행중인 쿼리를 취소하려고합니다. (그럴 수 토토 결과 신호 핸들러에서 완료되었지만 그렇지 않으면.)

  • PQEXEC하나만 반환 할 수 토토 결과 pgresult 구조. 제출 된 쿼리 문자열에 포함 된 경우 다수의SQL명령, 모두 마지막 pgresult는에 의해 폐기됩니다.PQEXEC.

이러한 제한을 좋아하지 않는 응용 프로그램은 대신 할 수 토토 결과 의 기본 기능을 사용하십시오.PQEXEC에서 구축되었습니다 :pqsendqueryandpqgetresult.

이 기능을 사용한 이전 프로그램과pqputlineandpqputnbytes데이터를 보내기 위해 대기하는 차단 백엔드, 해당 문제를 해결하기 위해 함수pqsetnonBlocking추가되었습니다.

오래된 응용 프로그램은 사용을 무시할 수 토토 결과pqsetnonBlocking잠재적으로 구식을 얻으십시오 행동 차단. 최신 프로그램을 사용할 수 토토 결과pqsetnonBlocking완전히 달성합니다 백엔드에 대한 비 차단 연결.

  • pqsetnonblocking연결의 차단 상태.

    int pqsetnonblocking (pgconn *conn, int arg)
    arg 인 경우 비 블로킹에 연결 상태를 설정합니다. 사실, Arg가 거짓이면 차단합니다. OK 인 경우 0을 반환합니다. -1 오류 인 경우

    비 차단 상태에서pqputline, pqputnbytes, pqsendqueryandPQENDCOPY차단하지 않고 대신 돌아갑니다 다시 호출 해야하는 경우 오류입니다.

    데이터베이스 연결이 비 차단으로 설정된 경우 모드 및PQEXEC호출됩니다 일시적으로 블록 연결 상태를 때까지 그만큼PQEXEC완료.

    LIBPQ의 더 많은 사람들이 안전해질 것으로 예상됩니다pqsetnonBlocking가까운 기능 미래.

  • PqisnonBlocking반환합니다 데이터베이스 연결 상태 차단.

    int pqisnonblocking (const pgconn *conn)
    연결이 비 블로킹 모드로 설정된 경우 true를 반환합니다. 차단하면 거짓.
  • pqsendquery쿼리 제출Postgres기다리지 않고 결과. 쿼리가 성공적으로 사용되면 True가 반환됩니다 없으면 거짓 (이 경우 pqerrormessage를 사용합니다 실패에 대한 자세한 정보를 얻으려면).

    int pqsendquery (pgconn *conn,
                    const char *query);
    성공적으로 전화 한 후pqsendquery, Callpqgetresult쿼리를 얻기 위해 한 번 이상 결과.pqsendquery호출되지 않을 수 토토 결과 다시 (같은 연결에)까지pqgetresultNULL을 반환하여 쿼리가 완료되었습니다.
  • pqgetresult다음을 기다리십시오 이전의 결과pqsendquery, 그리고 그것을 돌려주십시오. 쿼리가 완료되면 NULL이 반환됩니다 그리고 더 이상 결과가 없을 것입니다.

    pgresult *pqgetresult (pgconn *conn);
    pqgetresult호출해야합니다 NULL을 반환 할 때까지 반복적으로 쿼리가 완료. (쿼리가 없을 때 호출 된 경우pqgetresult한 번에 null을 반환합니다.) 각각 비 널 결과pqgetresult동일한 pgresult 액세서를 사용하여 처리해야합니다 이전에 설명 된 기능. 각각을 자유롭게하는 것을 잊지 마십시오 이있는 결과 객체PQCLEAR언제 그것으로 끝났습니다. 참고pqgetresult쿼리가 활성화되어 필요한 경우에만 차단됩니다. 응답 데이터는 아직 읽지 않았습니다.pqconsumeInput.

사용pqsendqueryandpqgetresult을 해결합니다PQEXEC의 문제 : 쿼리 문자열에 포함 된 경우 다수의SQL명령, 결과 이러한 명령 중 개별적으로 얻을 수 토토 결과. (이것은 허용합니다 그건 그렇고, 중첩 처리의 간단한 형태 : The Frontend 백엔드가있는 동안 하나의 쿼리 결과를 처리 할 수 ​​토토 결과. 동일한 쿼리 문자열에서 나중에 쿼리 작업을 계속합니다.) 그러나 전화pqgetresult여전히 백엔드가 다음에 완료 될 때까지 프론트 엔드가 차단되게합니다SQL명령. 이것은 피할 수 있습니다 세 가지 기능의 적절한 사용 :

  • pqconsumeInput입력 인 경우 백엔드에서 사용할 수 있습니다.

    int pqconsumeInput (pgconn *conn);
    pqconsumeInput일반적으로 1 "오류 없음"을 나타내지 만 어떤 종류의 경우 0을 반환합니다. 문제 (어떤 경우PQERRORMESSAGEis 세트). 결과는 입력 데이터가 있는지 여부를 말하지 않습니다. 실제로 수집되었습니다. 전화 후pqconsumeInput, 신청서가 확인할 수 토토 결과PQISBUSY및/또는pqnotifies상태가 바뀌 었는지 확인하려면

    pqconsumeInput호출 될 수 있습니다 응용 프로그램이 결과를 처리 할 준비가되어 있지 않더라도 또는 아직 알림. 루틴은 사용 가능합니다 데이터를 데이터로 저장하여 버퍼에 저장하여 A를 유발합니다.select(2) 사라질 준비가 된 표시. 따라서 응용 프로그램은 사용할 수 있습니다pqconsumeInputselect즉시 조건 레저에서 결과를 검사하십시오.

  • PQISBUSY쿼리가있는 경우 1을 반환합니다 바쁘다, 즉pqgetresult입력을 기다리는 블록. 0 반환은를 나타냅니다.pqgetresult보증으로 호출 할 수 토토 결과 차단되지 않습니다.

    int pqisbusy (pgconn *conn);
    PQISBUSY그 자체가 시도하지 않을 것입니다 백엔드에서 데이터를 읽습니다. 그러므로pqconsumeInput먼저, 또는 바쁘다 상태는 결코 끝나지 않을 것입니다.
  • pqflush플러시를 시도합니다 백엔드에 대기하는 데이터는 성공한 경우 0을 반환합니다 (또는 전송 대기열이 비어 있거나 일부는 실패한 경우 eof 이유.

    int pqflush (pgconn *conn);
    pqflusha 호출 전 비 차단 연결select응답이 도착했는지 확인합니다. 0 인 경우 반환되면 백엔드에 대기되는 데이터가 없도록합니다. 실제로 보내지 않았습니다. 사용한 응용 프로그램 만pqsetnonBlocking이것에 대한 필요가 토토 결과.
  • pqsocket파일을 얻습니다 백엔드 연결 소켓의 디스크립터 번호. 유효한 설명자는 = 0입니다. -1의 결과는 아니오를 나타냅니다 백엔드 연결이 현재 열려 있습니다.

    int pqsocket (const pgconn *conn);
    pqsocket획득하는 데 사용해야합니다 실행 준비를위한 백엔드 소켓 디스크립터select(2). 이것은 응용 프로그램을 허용합니다 차단 연결을 사용하여 백엔드 응답을 기다리거나 다른 조건. 의 결과 인 경우select(2)는 데이터를 읽을 수 있음을 나타냅니다 백엔드 소켓,pqconsumeInput데이터를 읽기 위해 호출되어야합니다. 그 후,PQISBUSY, pqgetresult, 및/또는pqnotifies처리에 사용될 수 있습니다 응답.

    비 차단 연결 (사용한pqsetnonBlocking) 사용해서는 안됩니다selectTLEALEpqflush0을 반환했습니다 버퍼링 된 데이터는 백엔드로 전송되기를 기다리고 토토 결과.

이러한 기능을 사용하는 일반적인 프론트 엔드에는 기본 루프가 있습니다. 사용select(2) 모든 것을 기다리려면 응답 해야하는 조건. 조건 중 하나가 될 것입니다 백엔드에서 사용할 수있는 입력,select의 용어는 파일에서 읽을 수있는 데이터입니다 에 의해 식별 된 설명 자pqsocket. 언제 메인 루프는 입력 준비를 감지하고 호출해야합니다pqconsumeInput입력을 읽으려면. 그렇다면 할 수 토토 결과 부르다PQISBUSY그 뒤에pqgetresultifPQISBUSY거짓 (0)을 반환합니다. 또한 전화 할 수 토토 결과pqnotifies알림 메시지를 감지하려면 (참조 "비동기식 알림", 아래).

사용하는 프론트 엔드pqsendquery/pqgetresult아직 처리중인 쿼리를 취소하려고 할 수도 토토 결과. 백엔드로.

  • pqRequestCancel요청Postgres포기 처리 현재 쿼리의.

    int pqRequestCancel (pgconn *conn);
    취소 요청이 성공적으로 인 경우 반환 값이 1입니다. 없으면 0. (그렇지 않은 경우PQERRORMESSAGE왜 그렇지 않은지 알려줍니다.) 성공적인 파견 그러나 요청이 어떤 영향을 미칠 것이라고 보장하지 않습니다. 반환 값에 관계없이PQREQUESTCANCEL, 응용 프로그램은 계속해야합니다 사용 정상 결과 읽기 순서pqgetresult. 취소가 효과적이면 현재 쿼리는 조기에 종료되고 오류를 반환합니다 결과. 취소가 실패한 경우 (예 : 백엔드이기 때문에 이미 쿼리 처리를 수행했습니다). 전혀 눈에 띄는 결과.

현재 쿼리가 트랜잭션의 일부인 경우 취소는 전체 거래를 중단합니다.

pqRequestCancel안전하게 할 수 있습니다 신호 핸들러에서 호출. 따라서 사용하는 것도 가능합니다 평원과 함께PQEXEC, if 취소 결정은 신호 처리기에서 이루어질 수 있습니다. 을 위한 예,PSQL호출pqRequestCancelSigint 신호 핸들러에서 따라서 문제가 발생하는 쿼리의 대화식 취소를 허용합니다 을 통해PQEXEC. 참고PQREQUESTCANCEL연결은 현재 열려 있지 않거나 백엔드가 현재 없습니다. 쿼리 처리.