libpq파이프 라인 모드를 사용하면 응용 프로그램이 이전에 보낸 쿼리의 결과를 읽지 않고도 쿼리를 보낼 수 있습니다. 파이프 라인 모드를 활용하면 클라이언트는 단일 네트워크 트랜잭션에서 여러 쿼리/결과를 보내거나받을 수 있기 때문에 서버를 기다릴 수 있습니다.
파이프 토토 모드는 상당한 성능 향상을 제공하지만 파이프 토토 모드를 사용하는 클라이언트를 작성하는 클라이언트는 보류중인 쿼리 대기열을 관리하고 큐의 어떤 쿼리에 해당하는지 찾는 것이 더 복잡합니다..
파이프 토토 모드는 일반적으로 클라이언트와 서버 모두에 더 많은 메모리를 소비하지만, 보내기/수신 큐의 신중하고 공격적인 관리가이를 완화 할 수 있습니다. 이것은 연결이 차단되었는지 또는 비 차단 모드인지 여부를 적용합니다.
whilelibpq의 파이프 토토 API가 소개되었습니다PostgreSQL14, 특수 서버 지원이 필요하지 않고 V3 확장 쿼리 프로토콜을 지원하는 모든 서버에서 작동하는 클라이언트 측 기능입니다. 자세한 내용은 참조섹션 53.2.4.
파이프 토토을 발행하려면 응용 프로그램이 연결을 파이프 토토 모드로 전환해야합니다.PQENTERPIPELINEMODE
. PQPIPELINESTATUS
파이프 토토 모드가 활성인지 테스트하는 데 사용할 수 있습니다. 파이프 토토 모드에서만비동기 작업허용, 여러 SQL 명령을 포함하는 명령 문자열이 허용되지 않으며copy
. 동기식 명령 실행 함수 사용PQFN
, PQEXEC
, PQEXECPARAMS
, pqprepare
, pqExecprepared
, pqdescribePrepared
, pqdescribePortal
는 오류 조건입니다. 모든 파견 된 명령이 결과를 처리하고 최종 파이프 토토 결과가 소비되면 응용 프로그램은를 사용하여 비 지정 모드로 돌아갈 수 있습니다.PQEXITPIPELINEMODE
.
파이프 토토 모드를 입력 한 후 응용 프로그램은를 사용하여 요청을 발송합니다.pqsendquery
, pqsendqueryparams
또는 준비된 형제 자매pqsendqueryprepared
. 이러한 요청은 서버로 플러시 될 때까지 클라이언트 측에서 대기됩니다.PQPIPELINESYNC
파이프 토토에서 동기화 지점을 설정하는 데 사용되거나pqflush
호출됩니다. 기능pqsendprepare
, pqsendDescribreprepared
및pqsenddescribePortal
파이프 토토 모드에서도 작동합니다. 결과 처리는 아래에 설명되어 있습니다.
서버는 명령문을 실행하고 클라이언트가 보내는 순서대로 결과를 반환합니다. 서버는 파이프 토토의 끝을 기다리지 않고 즉시 파이프 토토의 명령을 실행하기 시작합니다.PQPIPELINESYNC
또는 언제pqsendflushrequest
호출됩니다. 명령문이 오류가 발생하면 서버는 현재 트랜잭션을 중단하고 다음 동기화 지점까지 큐에서 후속 명령을 실행하지 않습니다.pgres_pipeline_aborted
결과는 각 명령에 대해 생성됩니다. (파이프 토토의 명령이 트랜잭션을 롤백하더라도 사실 상태로 남아 있습니다.) 동기화 지점 후에 쿼리 처리가 재개됩니다.
이전 작업의 결과에 의존하는 것은 한 번의 작업이 좋습니다. 예를 들어, 한 쿼리는 동일한 파이프 라인에서 다음 쿼리가 사용하는 테이블을 정의 할 수 있습니다.
파이프 토토에서 하나의 쿼리 결과를 처리하려면 응용 프로그램이 호출됩니다.pqgetresult
반복적으로 각 결과를 처리 할 때까지 각 결과를 처리합니다pqgetresult
NULL을 반환합니다. 파이프 라인의 다음 쿼리 결과를 사용하여를 사용하여 검색 할 수 있습니다.pqgetresult
다시 사이클이 반복되었습니다. 응용 프로그램은 개별 명세서 결과를 정상적으로 처리합니다.pqgetresult
상태 값이 포함 된 결과를 반환pgres_pipeline_sync
클라이언트는 전체 파이프 토토이 전송 될 때까지 결과 처리를 연기하거나 파이프 토토에서 추가 쿼리를 보내는 것을 인터 리브 할 수 있습니다. 보다섹션 34.5.1.4.
싱글 열 모드로 들어가려면 전화pqsetsinglerowmode
결과를 검색하기 전에pqgetresult
. 이 모드 선택은 현재 처리중인 쿼리에만 효과적입니다.pqsetsinglerowmode
, 참조섹션 34.6.
pqgetresult
새로운 것을 포함 할 수있는 경우를 제외하고 정상적인 비동기 처리와 동일하게 행동합니다pgresult
typespgres_pipeline_sync
andpgres_pipeline_aborted
. pgres_pipeline_sync
각각에 대해 정확히 한 번보고됩니다PQPIPELINESYNC
파이프 토토의 해당 지점에서.pgres_pipeline_aborted
첫 번째 오류에 대한 일반 쿼리 결과 대신 방출됩니다.pgres_pipeline_sync
; 보다섹션 34.5.1.3.
PQISBUSY
, pqconsumeInput
등은 파이프 토토 결과를 처리 할 때 정상적으로 작동합니다. 특히, 전화PQISBUSY
지금까지 발행 된 모든 쿼리의 결과가 소비 된 경우 파이프 토토 중간에 0을 반환합니다.
libpq현재 처리중인 쿼리에 대한 응용 프로그램에 정보를 제공하지 않습니다 (제외pqgetresult
NULL을 반환하여 다음 쿼리의 결과를 반환하기 시작 함을 나타냅니다). 응용 프로그램은 쿼리를 보낸 순서를 추적하여 해당 결과와 연결해야합니다.
고객의 관점에서pqresultstatus
반환pgres_fatal_error
, 파이프 토토은 낙태로 표시됩니다.pqresultstatus
보고서 apgres_pipeline_aborted
중단 된 파이프 토토에서 나머지 대기열 작업에 대한 결과. 결과PQPIPELINESYNC
pgres_pipeline_sync
유도 된 파이프 토토의 끝과 정상 결과 처리의 재개를 알리려면
클라이언트필수프로세스 결과pqgetresult
오류 복구 중.
파이프 토토이 암시 적 트랜잭션을 사용한 경우 이미 실행 된 작업이 롤백되고 실패한 작업을 따를 수 있도록 대기하는 작업이 완전히 건너 뜁니다. 파이프 토토이 시작되고 단일 명시 적 트랜잭션을 수행하는 경우 동일한 동작이 유지됩니다 (예 : 첫 번째 진술은시작
그리고 마지막은커밋
) 세션이 파이프 토토 끝에 중단 된 트랜잭션 상태에 남아있는 경우를 제외하고. 파이프 토토에 포함 된 경우다중 명시 적 거래, 오류 전에 저지른 모든 트랜잭션은 커밋 된 상태로 유지되며 현재 진행중인 거래는 중단되며 후속 거래를 포함하여 모든 후속 운영이 완전히 건너 뜁니다. 파이프 라인 동기화 지점이 중단 된 상태의 명시 적 트랜잭션 블록과 함께 발생하면 다음 명령이 트랜잭션을 정상 모드로 설정하지 않으면 다음 파이프 라인이 즉시 중단됩니다.롤백
.
클라이언트는 작업이 커밋되었다고 가정해서는 안됩니다Sends a 커밋
- 커밋이 완료되었는지 확인하기 위해 해당 결과가 수신 된 경우에만. 오류가 비동기식으로 도달하기 때문에 응용 프로그램은 마지막부터 다시 시작할 수 있어야합니다.수신무언가 잘못되면 그 시점 이후에 수행 된 작업을 저지른 변화와 재현.
대형 파이프 라인의 교착 상태를 피하려면 클라이언트는와 같은 운영 체제 시설을 사용하여 비 차단 이벤트 루프 주위에 구성되어야합니다.select
, 폴
, WaitformultipleObjectex
등
클라이언트 애플리케이션은 일반적으로 파견 될 작업 대기열을 유지해야하며 아직 발송되었지만 아직 결과가 처리되지 않은 작업 대기열을 유지해야합니다. 소켓을 쓰면 더 많은 작업을 파견해야합니다.
사용 예제select ()
그리고 전송 및받은 작업을 추적하기위한 간단한 상태 기계가src/test/modules/libpq_pipeline/libpq_pipeline.c
PostgreSQL 소스 분포에서
PQPIPELINESTATUS
현재 파이프 라인 모드 상태를 반환합니다libpq연결.
pgpipelinestatus pqpipelinestatus (const pgconn *conn);
PQPIPELINESTATUS
다음 값 중 하나를 반환 할 수 있습니다.
pq_pipeline_on
thelibpq연결은 파이프 토토 모드에 있습니다.
pq_pipeline_off
thelibpq연결 ISnot파이프 토토 모드에서.
pq_pipeline_aborted
thelibpq연결은 파이프 라인 모드에 있으며 현재 파이프 라인을 처리하는 동안 오류가 발생했습니다. 중단 된 깃발은pqgetresult
유형의 결과를 반환pgres_pipeline_sync
.
PQENTERPIPELINEMODE
현재 유휴 상태이거나 이미 파이프 라인 모드에있는 경우 파이프 라인 모드에 연결됩니다.
int pqenterpipelinemode (pgconn *conn);
성공을 위해 1을 반환합니다. 연결이 현재 유휴 상태가 아닌 경우 0을 반환하고 효과가 없습니다. 즉, 결과가 준비되거나 서버에서 더 많은 입력을 기다리고 있습니다.libpq연결 상태.
PQEXITPIPELINEMODE
현재 빈 큐가 있고 보류중인 결과가없는 파이프 라인 모드에있는 경우 파이프 라인 모드를 종료합니다.
int pqexitpipelinemode (pgconn *conn);
성공을 위해 1을 반환합니다. 파이프 라인 모드가 아닌 경우 1을 반환하고 조치를 취하지 않습니다.pqgetresult
이전에 보낸 모든 쿼리에서 결과를 수집하기 위해 호출되지 않았습니다.PQERRORMESSAGE
실패에 대한 자세한 정보를 얻으려면).
PQPIPELINESYNC
a를 보내서 파이프 토토의 동기화 지점을 표시합니다동기화 메시지그리고 보내기 버퍼를 플러싱합니다. 이것은 암시 적 트랜잭션의 구분 기자 역할을하며 오류 복구 지점입니다.섹션 34.5.1.3.
int pqpipelinesync (pgconn *conn);
성공을 위해 1을 반환합니다. 연결이 파이프 라인 모드에 있지 않거나 A를 보내는 경우 0 리턴 0동기화 메시지실패.
pqsendflushrequest
서버가 출력 버퍼를 플러시하라는 요청을 보냅니다.
int pqsendflushrequest (pgconn *conn);
성공을 위해 1을 반환합니다. 실패로 0을 반환합니다.
서버는의 결과로 출력 버퍼를 자동으로 플러시합니다.PQPIPELINESYNC
파이프 토토 모드에 있지 않은 경우 호출 또는 요청에 따라; 이 기능은 서버가 동기화 지점을 설정하지 않고 파이프 토토 모드에서 출력 버퍼를 플러시하게하는 데 유용합니다.pqflush
필요한 경우.
비동기 쿼리 모드와 마찬가지로 파이프 라인 모드를 사용할 때 의미있는 성능 오버 헤드가 없습니다. 클라이언트 애플리케이션 복잡성을 증가시키고 클라이언트/서버 교착 상태를 방지하기 위해서는 추가주의가 필요하지만 파이프 라인 모드는 메모리 사용이 더 오래 남아있을 수없는 대가로 상당한 성능 향상을 제공 할 수 있습니다..
파이프 토토 모드는 서버가 먼 경우, 즉 네트워크 대기 시간 (에 가장 유용합니다.“Ping Time”)가 높고 많은 소규모 작업이 급속히 연속적으로 수행 될 때. 각 쿼리가 클라이언트/서버 왕복 시간의 여러 배수를 실행하는 경우 파이프 라인 명령을 사용하는 데 일반적으로 이점이 적습니다.
응용 프로그램이 작을 때 파이프 토토 명령 사용삽입
, 업데이트
and삭제
세트의 작업 또는 A로 쉽게 변환 할 수없는 작업copy
작동.
한 번의 작업의 정보가 다음 작업을 생성하기 위해 한 번의 작업의 정보가 필요할 때 파이프 라인 모드가 유용하지 않습니다. 이러한 경우 클라이언트는 동기화 지점을 도입하고 필요한 결과를 얻기 위해 전체 클라이언트/서버 왕복을 기다려야합니다.
시작;
훨씬 더 효율적으로 수행 할 수 있습니다 :
MyTable Set x = x + 1 업데이트 여기서 id = 42;
단일 파이프 토토에 여러 트랜잭션이 포함되어있을 때 파이프 토토은 덜 유용하고 복잡합니다 (참조섹션 34.5.1.3).
[15]클라이언트는 서버로 쿼리를 보내려고 시도하지만 서버는 이미 처리 된 쿼리에서 클라이언트에 결과를 보내려고 시도합니다. 이는 클라이언트가 서버에서 처리 입력으로 전환하기 전에 출력 버퍼와 서버의 수신 버퍼를 채울 수있는 충분한 쿼리를 보낼 때만 발생하지만 언제 발생할 것인지 정확히 예측하기는 어렵습니다..
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면