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

32.4. 비동기 와이즈 토토 처리

PQexec함수는 일반적인 동기 애플리케이션에서 와이즈 토토을 제출하는 데 적합합니다. 그러나 일부 사용자에게는 중요할 수 있는 몇 가지 결함이 있습니다.

  • PQexec와이즈 토토이 완료되기를 기다립니다. 애플리케이션에 수행해야 할 다른 작업(예: 사용자 인터페이스 유지 관리)이 있을 수 있으며, 이 경우 응답 대기를 차단하지 않을 것입니다.

  • 클라이언트 응용 프로그램의 실행이 결과를 기다리는 동안 일시 중지되므로 응용 프로그램이 진행 중인 와이즈 토토을 취소하려고 하는지 결정하기가 어렵습니다. (신호 처리기에서 수행할 수 있지만 그렇지 않으면 수행할 수 없습니다.)

  • PQexec하나만 반환할 수 있습니다.PGresult구조. 제출된 와이즈 토토 문자열에 여러 개가 포함된 경우SQL와이즈 토토, 마지막을 제외한 모든 와이즈 토토PGresult에 의해 삭제됨PQexec.

  • PQexec항상 와이즈 토토의 전체 결과를 수집하여 단일로 버퍼링합니다.PGresult. 이는 애플리케이션의 오류 처리 논리를 단순화하지만 많은 행을 포함하는 결과에는 비실용적일 수 있습니다.

이러한 제한이 마음에 들지 않는 응용 프로그램은 대신 기본 기능을 사용할 수 있습니다.PQexec다음에서 빌드됨:PQsendQuery그리고PQgetResult. 또한 있습니다PQsendQueryParams, PQsendPrepare, PQsendQuery준비됨, PQsendDescribe준비됨PQsendDescribePortal, 다음과 함께 사용할 수 있습니다.PQgetResult기능을 복제하기 위해PQexecParams, PQprepare, PQexec준비됨, PQdescribe준비됨PQdescribePortal각각.

PQsendQuery

결과를 기다리지 않고 서버에 명령을 제출합니다. 명령이 성공적으로 전달되면 1이 반환되고, 그렇지 않으면 0이 반환됩니다. 이 경우에는 다음을 사용하세요.PQerrorMessage실패에 대한 추가 정보를 얻으려면).

int PQsendQuery(PGconn *conn, const char *command);

성공적으로 호출한 후PQsendQuery, 전화PQgetResult결과를 얻기 위해 한 번 이상.PQsendQuery다음까지 (동일한 연결에서) 다시 호출할 수 없습니다.PQgetResult와이즈 토토이 완료되었음을 나타내는 널 포인터를 반환했습니다.

PQsendQueryParams

결과를 기다리지 않고 서버에 와이즈 토토과 별도의 매개변수를 제출합니다.

int PQsendQueryParams(PGconn *conn,
                      const char *명령,
                      정수 nParams,
                      const Oid *paramTypes,
                      const char * const *paramValues,
                      const int *paramLengths,
                      const int *paramFormats,
                      int resultFormat);

이것은 다음과 같습니다.PQsendQuery단, 쿼리 매개변수는 쿼리 문자열과 별도로 지정할 수 있습니다. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQexecParams. 좋아요PQexecParams, 2.0 프로토콜 연결에서는 작동하지 않으며 쿼리 문자열에는 하나의 와이즈 토토만 허용됩니다.

PQsendPrepare

완료를 기다리지 않고 주어진 매개변수를 사용하여 준비된 와이즈 토토문을 생성하라는 요청을 보냅니다.

int PQsendPrepare(PGconn *conn,
                  const char *stmt이름,
                  const char *쿼리,
                  정수 nParams,
                  const Oid *paramTypes);

이것은 비동기 버전입니다.PQprepare: 요청을 전달할 수 있으면 1을 반환하고 그렇지 않으면 0을 반환합니다. 통화가 성공한 후 전화하세요.PQgetResult서버가 준비된 명령문을 성공적으로 생성했는지 여부를 확인합니다. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQprepare. 좋아요PQprepare, 2.0 프로토콜 연결에서는 작동하지 않습니다.

PQsendQuery준비됨

결과를 기다리지 않고 주어진 매개변수로 준비된 와이즈 토토문을 실행하라는 요청을 보냅니다.

int PQsendQueryPrepared(PGconn *conn,
                        const char *stmt이름,
                        정수 nParams,
                        const char * const *paramValues,
                        const int *paramLengths,
                        const int *paramFormats,
                        int resultFormat);

이것은 다음과 유사합니다.PQsendQueryParams, 그러나 쿼리 문자열을 제공하는 대신, 미리 준비된 명령문의 이름을 지정하여 실행할 명령을 지정합니다. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQexec준비됨. 좋아요PQexec준비됨, 2.0 프로토콜 연결에서는 작동하지 않습니다.

PQsendDescribePrepared

완료를 기다리지 않고 지정된 준비된 명령문에 대한 정보를 얻기 위한 요청을 제출합니다.

int PQsendDescribePrepared(PGconn *conn, const char *stmtName);

이것은 비동기 버전입니다.PQdescribe준비됨: 요청을 전달할 수 있으면 1을 반환하고 그렇지 않으면 0을 반환합니다. 통화가 성공한 후 전화하세요.PQgetResult결과를 얻으려면. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQdescribe준비됨. 좋다PQdescribe준비됨, 2.0 프로토콜 연결에서는 작동하지 않습니다.

PQsendDescribePortal

완료를 기다리지 않고 지정된 포털에 대한 정보를 얻기 위한 요청을 제출합니다.

int PQsendDescribePortal(PGconn *conn, const char *portalName);

이것은 비동기 버전입니다.PQdescribePortal: 요청을 전달할 수 있으면 1을 반환하고 그렇지 않으면 0을 반환합니다. 통화가 성공한 후 전화하세요.PQgetResult결과를 얻으려면. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQdescribePortal. 좋아요PQdescribePortal, 2.0 프로토콜 연결에서는 작동하지 않습니다.

PQgetResult

이전의 다음 결과를 기다립니다.PQsendQuery, PQsendQueryParams, PQsendPrepare, PQsendQuery준비됨, PQsendDescribe준비됨, 또는PQsendDescribePortal호출하고 반환합니다. 와이즈 토토이 완료되면 null 포인터가 반환되고 더 이상 결과가 없습니다.

PGresult *PQgetResult(PGconn *conn);

PQgetResult와이즈 토토이 완료되었음을 나타내는 널 포인터를 반환할 때까지 반복적으로 호출되어야 합니다. (활성화된 와이즈 토토이 없을 때 호출되는 경우,PQgetResult한 번에 null 포인터를 반환합니다.) null이 아닌 각 결과는PQgetResult동일한 것을 사용하여 처리되어야 합니다PGresult이전에 설명한 접근자 함수입니다. 다음을 사용하여 각 결과 객체를 해제하는 것을 잊지 마세요.PQclear완료되면. 참고하세요PQgetResult와이즈 토토이 활성화되어 있고 필요한 응답 데이터가 아직 읽혀지지 않은 경우에만 차단됩니다.PQconsumeInput.

참고:그때에도PQresultStatus치명적인 오류를 나타냅니다.PQgetResult널 포인터를 반환할 때까지 호출되어야 합니다.libpq오류 정보를 완전히 처리합니다.

사용 중PQsendQuery그리고PQgetResult다음 중 하나를 해결합니다.PQexec의 문제: 와이즈 토토 문자열에 여러 개가 포함된 경우SQL와이즈 토토을 사용하면 해당 와이즈 토토의 결과를 개별적으로 얻을 수 있습니다. (이것은 간단한 형태의 중첩 처리를 허용합니다. 클라이언트는 한 와이즈 토토의 결과를 처리하는 동안 서버는 동일한 와이즈 토토 문자열에서 이후 쿼리를 계속 작업할 수 있습니다.)

다음으로 얻을 수 있는 자주 원하는 또 다른 기능PQsendQuery그리고PQgetResult큰 쿼리 결과를 한 번에 한 행씩 검색하고 있습니다. 이에 대해서는에서 논의됩니다.섹션 32.5.

저절로 호출됨PQgetResult서버가 다음 작업을 완료할 때까지 클라이언트가 계속 차단됩니다SQL와이즈 토토. 이는 두 가지 추가 기능을 적절하게 사용하면 피할 수 있습니다.

PQconsumeInput

서버에서 입력이 가능하다면, 그것을 소비하세요.

int PQconsumeInput(PGconn *conn);

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

PQconsumeInput애플리케이션이 아직 결과나 알림을 처리할 준비가 되지 않은 경우에도 호출할 수 있습니다. 이 함수는 사용 가능한 데이터를 읽고 이를 버퍼에 저장하므로선택()읽기 준비 표시가 사라집니다. 따라서 애플리케이션은 다음을 사용할 수 있습니다.PQconsumeInput깨끗하게선택()즉시 조건을 설정하고 여유 시간에 결과를 검토하세요.

PQisBusy

명령이 사용 중인 경우 1을 반환합니다. 즉,PQgetResult입력 대기를 차단합니다. 0 반환은 다음을 나타냅니다.PQgetResult차단하지 않는다는 확신을 갖고 호출할 수 있습니다.

int PQisBusy(PGconn *conn);

PQisBusy자체는 서버에서 데이터를 읽으려고 시도하지 않습니다. 그러므로PQconsumeInput먼저 호출해야 합니다. 그렇지 않으면 사용 중 상태가 끝나지 않습니다.

이러한 함수를 사용하는 일반적인 응용프로그램에는 다음을 사용하는 메인 루프가 있습니다.선택()또는설문조사()응답해야 하는 모든 조건을 기다립니다. 조건 중 하나는 서버에서 입력할 수 있으며, 이는 다음과 같습니다.선택()다음으로 식별된 파일 설명자에서 읽을 수 있는 데이터를 의미합니다.PQsocket. 메인 루프가 입력 준비를 감지하면 호출해야 합니다.PQconsumeInput입력을 읽습니다. 그런 다음 호출할 수 있습니다.PQisBusy, 이어서PQgetResultifPQisBusy거짓(0)을 반환합니다. 전화할 수도 있습니다.PQ알림탐지하다알림메시지(참조PostgreSQL : 문서 : 9.6 : 비동기 윈 토토).

다음을 사용하는 클라이언트PQsendQuery/PQgetResult또한 서버에서 아직 처리 중인 와이즈 토토을 취소하려고 시도할 수 있습니다. 참조토토 사이트 : 문서 : 9.6 : 진행중인 쿼리 취소. 그러나 반환 값에 관계없이PQ취소, 애플리케이션은 다음을 사용하여 일반적인 결과 읽기 시퀀스를 계속해야 합니다.PQgetResult. 성공적으로 취소되면 와이즈 토토이 다른 경우보다 더 빨리 종료됩니다.

위에서 설명한 기능을 사용하면 데이터베이스 서버의 입력을 기다리는 동안 차단되는 것을 방지할 수 있습니다. 그러나 애플리케이션이 출력을 서버로 보내기를 기다리는 것을 차단할 가능성은 여전히 있습니다. 이는 상대적으로 흔하지 않지만 매우 긴 SQL 명령이나 데이터 값이 전송되는 경우 발생할 수 있습니다. (애플리케이션이 다음을 통해 데이터를 보내는 경우 가능성이 훨씬 더 높습니다.복사, 그러나.) 이러한 가능성을 방지하고 완전한 논블로킹 데이터베이스 작업을 달성하려면 다음과 같은 추가 기능을 사용할 수 있습니다.

PQset비차단

연결의 비차단 상태를 설정합니다.

int PQsetnonblocking(PGconn *conn, int arg);

다음의 경우 연결 상태를 비차단으로 설정합니다.arg은 1이거나 다음과 같은 경우 차단argis 0. 정상이면 0을 반환하고 오류이면 -1을 반환합니다.

비차단 상태에서 호출PQsendQuery, PQputline, PQputnbytes, PQputCopyDataPQendcopy차단하지 않지만 대신 다시 호출해야 하는 경우 오류를 반환합니다.

참고하세요PQexec비차단 모드를 따르지 않습니다. 호출되면 어쨌든 패션을 차단하는 역할을 합니다.

PQis비차단

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

int PQisnonblocking(const PGconn *conn);

연결이 비차단 모드로 설정된 경우 1을 반환하고 차단하는 경우 0을 반환합니다.

PQ플러시

대기 중인 출력 데이터를 서버로 플러시하려고 시도합니다. 성공하면(또는 보내기 큐가 비어 있으면) 0을 반환하고, 어떤 이유로 실패하면 -1을 반환하며, 보내기 큐에 있는 모든 데이터를 아직 보낼 수 없으면 1을 반환합니다(이 경우는 연결이 비차단인 경우에만 발생할 수 있습니다).

int PQflush(PGconn *conn);

비차단 연결에서 명령이나 데이터를 보낸 후 다음을 호출하세요.PQ플러시. 1을 반환하면 소켓이 읽기 또는 쓰기 준비가 될 때까지 기다립니다. 쓰기 가능해지면 호출하세요.PQflush다시. 읽을 준비가 되면 호출하세요.PQconsumeInput그런 다음 전화하세요PQflush다시. 까지 반복하세요.PQ플러시0을 반환합니다. (읽기 준비를 확인하고 다음을 사용하여 입력을 배출해야 합니다.PQconsumeInput, 왜냐하면 서버가 우리에게 데이터(예: NOTICE 메시지)를 보내려는 시도를 차단할 수 있고 우리가 읽을 때까지 데이터를 읽지 않기 때문입니다.) 한 번PQflush0을 반환하고 소켓이 읽기 준비가 될 때까지 기다린 다음 위에서 설명한 대로 응답을 읽습니다.