| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| 배트맨 토토 : 문서 : 9.3 : Frontend/백엔드 프로토콜 | 배트맨 토토 : 문서 : 9.3 : Frontend/백엔드 프로토콜 | 48장. 프런트엔드/백엔드 프로토콜 | PostgreSQL : 문서 : 9.3 : 토토 사이트 흐름 | |
프로토콜에는 시작과 정상을 위한 별도의 단계가 있습니다. 운영. 시작 단계에서 프런트엔드는 다음에 대한 연결을 엽니다. 서버는 만족할 만큼 자신을 인증합니다. 서버. (여기에는 단일 메시지 또는 여러 메시지가 포함될 수 있습니다. 사용 중인 인증 방법에 따라 다릅니다.) 모두 진행되면 그러면 서버는 상태 정보를 프런트엔드에 보내고 드디어 정상작동 들어갑니다. 초기를 제외하고 시작 요청 메시지에서 프로토콜의 이 부분은 서버.
정상 작동 중에 프런트엔드는 쿼리 및 기타 사설 토토를 보냅니다. 백엔드에 명령을 보내고 백엔드는 쿼리 결과를 다시 보냅니다. 그리고 다른 응답들. 몇 가지 경우가 있습니다(예:알림) 여기서 백엔드는 원치 않는 사설 토토를 보냅니다. 사설 토토를 보내지만 대부분 세션의 이 부분이 주도됩니다. 프런트엔드 요청으로.
세션 종료는 일반적으로 프런트엔드 선택에 의해 이루어지지만 경우에 따라 백엔드에 의해 강제될 수 있습니다. 어쨌든, 언제 백엔드가 연결을 닫으면 열려 있는 모든 연결을 롤백합니다. (불완전) 종료 전 거래.
정상 작업 내에서 다음을 통해 SQL 명령을 실행할 수 있습니다. 두 개의 하위 프로토콜 중 하나입니다. 에서"간단하다 쿼리"프로토콜, 프런트엔드는 텍스트 쿼리만 보냅니다. 백엔드에서 구문 분석되어 즉시 실행되는 문자열입니다. 에서"확장 쿼리"프로토콜, 쿼리 처리는 구문 분석, 매개변수 값 바인딩 및 실행. 이는 유연성을 제공합니다. 성능상의 이점이 있지만 복잡성이 더 커집니다.
정상 작동에는 특수용 추가 하위 프로토콜이 있습니다. 다음과 같은 작업복사.
모든 의사소통은 메시지 스트림을 통해 이루어집니다. 첫 번째 메시지의 바이트는 메시지 유형을 식별하고 다음 4개는 바이트는 메시지의 나머지 길이를 지정합니다(이 길이는 count에는 자체가 포함되지만 메시지 유형 바이트는 포함되지 않습니다. 는 메시지의 나머지 내용은 메시지에 의해 결정됩니다. 유형. 역사적인 이유로, 에서 보낸 첫 번째 메시지는 클라이언트(시작 메시지)에는 초기 메시지 유형 바이트가 없습니다.
사설 토토 스트림과의 동기화 손실을 방지하려면 두 가지 모두 서버와 클라이언트는 일반적으로 전체 사설 토토를 버퍼로 읽습니다. (바이트 수를 사용하여) 내용을 처리하려고 시도하기 전에. 이를 통해 처리 중에 오류가 감지되면 쉽게 복구할 수 있습니다. 내용. 극단적인 상황(예: 충분하지 않은 경우) 사설 토토를 버퍼링하기 위한 메모리), 수신자는 바이트 수를 사용할 수 있습니다. 읽기를 다시 시작하기 전에 건너뛸 입력의 양을 결정합니다. 사설 토토.
반대로, 서버와 클라이언트 모두 주의해야 합니다. 불완전한 사설 토토를 보내세요. 이는 일반적으로 마샬링을 통해 수행됩니다. 사설 토토를 보내기 시작하기 전에 전체 사설 토토를 버퍼에 저장합니다. 만약 통신 실패는 전송 또는 수신 도중에 발생합니다. 사설 토토에 대한 유일한 합리적인 응답은 연결을 포기하는 것입니다. 사설 토토 경계를 복구할 가능성이 거의 없기 때문에 동기화.
확장 쿼리 프로토콜에서 SQL 명령 실행은 다음과 같습니다. 여러 단계로 나누어져 있습니다. 단계 사이에 유지되는 상태는 다음과 같습니다. 두 가지 유형의 객체로 표현됩니다.준비됨 진술그리고포털. 준비된 문은 구문 분석 및 의미 분석의 결과를 나타냅니다. 텍스트 쿼리 문자열. 준비된 진술 그 자체는 준비된 것이 아니다 실행하려면 특정 값이 부족할 수 있기 때문입니다.매개변수. 포털은 실행 준비가 완료된 상태를 나타냅니다. 또는 누락된 매개변수가 있는 이미 부분적으로 실행된 명령문 값이 채워졌습니다. (For선택문장, 포털은 열린 커서와 동일하지만 우리는 커서가 비-를 처리하지 않기 때문에 다른 용어선택문장.)
전체 실행 주기는 다음으로 구성됩니다.파싱단계, 다음에서 준비된 명령문을 생성합니다. 텍스트 쿼리 문자열; 에바인드단계, 준비된 설명과 값이 제공되는 포털을 생성합니다. 필요한 매개변수; 그리고실행걸음 포털의 쿼리를 실행하는 것입니다. 반환하는 쿼리의 경우 행(선택, 쇼등), 실행 단계에서 가져오도록 지시할 수 있습니다. 제한된 수의 행만 있으므로 여러 실행 단계가 수행될 수 있습니다. 작업을 완료하는 데 필요합니다.
백엔드는 준비된 여러 명령문을 추적할 수 있으며 포털(그러나 이는 세션 내에서만 존재하며 세션 간에 공유되지 않음) 기존 준비된 진술 및 포털은 생성 시 할당된 이름으로 참조됩니다. 에서 추가,"이름 없음"준비됨 성명서와 포털이 존재합니다. 이들은 대체로 동일하게 동작하지만 명명된 개체로서 해당 개체에 대한 작업은 다음과 같은 경우에 최적화됩니다. 쿼리를 한 번만 실행한 다음 삭제하는 반면 명명된 개체에 대한 작업은 다음을 기대하여 최적화됩니다. 다양한 용도로 사용됩니다.
특정 데이터 유형의 데이터는 다음 중 하나로 전송될 수 있습니다. 여러 가지 다른형식. 현재PostgreSQL7.4 유일하게 지원되는 형식은"텍스트"그리고"바이너리", 그러나 프로토콜은 다음을 제공합니다. 향후 확장. 모든 값에 대해 원하는 형식은 다음과 같이 지정됩니다. 에형식 코드. 클라이언트는 전송된 각 매개변수 값과 각 매개변수에 대한 형식 코드 쿼리 결과 열입니다. 텍스트의 형식 코드는 0이고 바이너리는 형식 코드 1 및 기타 모든 형식 코드는 향후를 위해 예약되어 있습니다. 정의.
값의 텍스트 표현은 문자열이 무엇이든 상관없습니다. 입출력 변환 함수에 의해 생성되고 수용됩니다. 특정 데이터 유형. 전송된 표현에는 후행 null 문자가 없습니다. 프런트엔드는 다음에 하나를 추가해야 합니다. C 문자열로 처리하려는 경우 수신된 값입니다. (텍스트 그런데 형식은 삽입된 null을 허용하지 않습니다.)
정수에 대한 이진 표현은 네트워크 바이트 순서를 사용합니다(대부분 중요한 바이트 먼저). 다른 데이터 유형에 대해서는 바이너리에 대해 알아보기 위한 문서 또는 소스 코드 표현. 에 대한 이진 표현을 명심하십시오. 복잡한 데이터 유형은 서버 버전에 따라 변경될 수 있습니다. 텍스트 일반적으로 형식이 더 이식성이 좋은 선택입니다.