?
本文檔使用
php中文網(wǎng)手冊(cè) 發(fā)布
PostgreSQL 是用一個(gè)簡(jiǎn)單的"每用戶一進(jìn)程"的"process per user"模型實(shí)現(xiàn)的。 在這種模式里一個(gè)客戶端進(jìn)程(client process) 只與恰好一個(gè)服務(wù)器進(jìn)程(server process)連接。 因?yàn)椴恢谰唧w要建立多少個(gè)連接,所以不得不利用一個(gè)主進(jìn)程(master process) 在每次連接請(qǐng)求時(shí)派生出一個(gè)新的服務(wù)器進(jìn)程來 這個(gè)主進(jìn)程叫做postgres, 它監(jiān)聽著一個(gè)特定的 TCP/IP 端口等待進(jìn)來的連接。 每當(dāng)檢測(cè)到一個(gè)連接請(qǐng)求時(shí),postgres進(jìn)程派生出一個(gè)新的服務(wù)器進(jìn)程。 服務(wù)器進(jìn)程之間使用信號(hào)燈(semaphores) 和共享內(nèi)存(shared memory)進(jìn)行通訊, 以確保在并發(fā)的數(shù)據(jù)訪問過程中的數(shù)據(jù)完整性。 在這種模式里一個(gè)客戶端進(jìn)程只與恰好一個(gè)服務(wù)器進(jìn)程連接。因?yàn)椴恢谰唧w要建立多少個(gè)連接,所以不得不利用一個(gè)主進(jìn)程在每次連接請(qǐng)求時(shí)派生出一個(gè)新的服務(wù)器進(jìn)程來。這個(gè)主進(jìn)程叫做 postgres ,它監(jiān)聽著一個(gè)特定的 TCP/IP 端口等待進(jìn)來的連接。每當(dāng)檢測(cè)到一個(gè)連接請(qǐng)求時(shí),postgres 進(jìn)程派生出一個(gè)新的服務(wù)器進(jìn)程。服務(wù)器進(jìn)程之間使用信號(hào)燈和共享內(nèi)存進(jìn)行通訊,以確保在并發(fā)的數(shù)據(jù)訪問過程中的數(shù)據(jù)完整性。
客戶端進(jìn)程可以是任何理解 PostgreSQL 協(xié)議(在Chapter 46描述)的程序。 許多客戶端都是基于 C 語言庫(kù)libpq的程序, 但是也存在幾個(gè)對(duì)協(xié)議之獨(dú)立的實(shí)現(xiàn),比如 JavaJDBC驅(qū)動(dòng)。
一旦建立起來連接,客戶端進(jìn)程就可以向后端(backend)(服務(wù)器)進(jìn)程發(fā)送查詢了。 查詢是通過純文本傳輸?shù)?,也就是說在前端(frontend)(客戶端)不做任何分析處理。 服務(wù)器分析查詢,創(chuàng)建執(zhí)行規(guī)劃(execution plan), 執(zhí)行該規(guī)劃并且通過已經(jīng)建立起來的連接把檢索出來的數(shù)據(jù)行返回給客戶端。