- Oracle數據庫從入門到運維實戰
- 甘長春 孟飛編著
- 3244字
- 2021-09-27 12:48:18
1.5 Oracle數據庫的連接模式
當用戶需要訪問數據庫時,在用戶端要建立一個用戶進程,在服務器端需要為用戶進程分配一個服務器進程,兩個進程之間建立連接,服務器進程處理用戶進程的請求。用戶端應用程序可以是SQL*Plus、EM、RMAN,或者用戶自己開發的Java應用程序。
用戶進程必須通過服務器進程才能訪問數據庫實例。服務器進程接受用戶進程的請求,解析并執行用戶進程發送的SQL命令,然后檢查數據庫高速緩存。如果用戶訪問的數據恰好就存儲在緩沖區中,那么服務器進程直接在緩沖區中對數據進行處理,并將執行結果返回給用戶進程。否則,服務器進程將從數據文件中讀取所需的數據,并將數據復制到數據庫高速緩存中,然后在數據庫高速緩存對數據進行處理。
一個服務器進程可以僅為一個用戶進程服務,也可以同時為多個用戶進程服務。根據用戶進程是否可以共享服務器進程,Oracle提供了兩種數據庫連接模式:專用數據庫連接模式和共享數據庫連接模式。
1.5.1 專用數據庫連接模式
在專用數據庫連接模式下,服務器進程與用戶進程是一一對應的。每當有一個用戶進程試圖與數據庫服務器建立連接時,數據庫服務器便啟動一個服務器進程為用戶進程服務。而當用戶進程訪問結束,斷開連接時,服務器進程也自動終止。圖1-8所示為數據庫連接模式中的專用連接模式。在這里要注意區分數據庫、數據庫服務器和服務器進程的概念。

圖1-8
在專用數據庫連接模式下,各個服務器進程之間完全獨立,它們之間并不共享數據。當用戶進程連接數據庫服務器時,服務器進程便被啟動,而且在一直運行,直到用戶進程斷開連接。
對于單個用戶進程而言,專用連接模式的效率很高,因為一個服務器進程只為一個用戶進程服務。但是對一個大型的數據庫系統而言,這種連接模式未必合適,一方面,在服務器端需要啟動大量的服務器進程,以處理眾多的用戶進程的請求,這對整個系統來說,負載很重。另一方面,當用戶進程和服務器進程建立連接后,服務器進程的大部分處理時間都在等待用戶的輸入/輸出,處理用戶的請求只需很短的時間。
如果用戶進程數目較少,或者用戶進程需要對數據庫進行大量的訪問,那么可以考慮將數據庫連接模式設置為專用模式。
1.5.2 共享數據庫連接模式
專用數據庫連接模式在處理大批量用戶連接時效率并不高,因為需要為每個用戶進程啟動一個服務器進程,這樣會消耗大量的系統資源。如果用戶進程的大部分連接時間都處于空閑狀態,服務器的資源就會被白白浪費。如在銀行系統中,計算機處理一次存取款的時間為幾毫秒,而工作人員輸入相關信息卻需要幾分鐘的時間。
Oracle提供了一種共享數據庫連接模式,這種模式允許一個服務器進程同時為多個用戶進程服務,多個用戶進程共享一個服務器進程。當一個用戶進程處于空閑狀態時,如正在等待用戶輸入數據,服務器進程就可以處理其他用戶進程的請求。在這種情況下,服務器進程的工作效率得到了很大的提高。
在數據庫服務器中可以啟動多個共享服務器進程,每個服務器進程都可以處理多個用戶請求,在數據庫服務器中只需少量的服務器進程就可以處理大量的用戶請求。
Oracle推薦在以下情況采用共享數據庫連接模式:
●在聯機事務處理(OLTP)環境中訪問數據庫。可能有大量用戶進程需要連接到數據庫服務器,這種模式可以使用戶進程有效地使用系統資源;
●計算機的內存有限。與專用服務器相比,當用戶進程數量增加時,共享服務器進程的數量并不需要增加,或者增加很少,這就減少了對內存的要求;
●如果需要使用Oracle Net的特性,如連接共享、連接集中和負載均衡。
共享數據庫連接模式的工作原理如圖1-9所示。

圖1-9
在圖1-9中,調度器、共享服務器進程、請求隊列和響應隊列共同完成共享數據庫連接模式的功能。其中,請求隊列和響應隊列是SGA的一部分,為了更清楚地表示這幾部分之間的關系,在圖中將這兩個隊列從SGA中分離出來。
調度器負責接收用戶的請求,并將用戶請求傳遞給適當的共享服務器進程。在一個數據庫服務器中可以啟動多個調度器,而且至少要為Oracle支持的每一種網絡協議啟動一個調度器(如TCP/IP、IPX/SPX、命名管道等)。可以通過初始化參數DISPATCHERS和MAX_DISPATCHERS來指定調度器的數目。其中,參數DISPATCHERS指定為某類網絡協議啟動的調度器,而MAX_D1SPATCHERS用來設置數據庫服務器中可以啟動的最大調度器的數目。例如:
DISPATCHERS=(PROTOCOL=TCP)(DISPATCHERS=3)
MAX_DISPATCHERS=20
上面的兩個參數規定為TCP/IP協議啟動3個調度器,而總的調度器數目為20。
當用戶進程向數據庫服務器發出請求時,監聽器在指定的端口監聽用戶的請求,并將請求傳遞給一個負載較輕的調度器,調度器將這個請求以及自己的ID一起放到請求隊列中。
共享服務器進程從請求隊列中取出一個請求,并對其中的SQL命令進行解析和執行,然后,將執行的結果放到響應隊列中。解析和執行的過程與專用服務器相同。
在一個數據庫服務器中可以啟動多個共享服務器進程,這些進程可以處理任何一個用戶進程發出的請求,而不是處理一個確定的請求。共享服務器進程的數目由初始化參數SHARED_SERVERS和MAX_SHARED_SERVERS指定。其中,參數SHARED_SERVERS指定在初始情況下需要啟動的共享服務器進程數目,而參數MAX_SHARED_SERVERS指定了允許啟動的最大共享服務器進程數目。當用戶請求較多時,數據庫服務器將啟動更多的共享服務器進程,而當用戶請求較少時,服務器將關閉不必要的共享服務器進程,但在任一時刻,共享服務器進程的數目將保持在兩個參數SHARED_SERVERS和MAX_SHARED_ SERVERS的值之間。
調度器除了負責將用戶進程的請求傳遞給共享服務器進程外,還負責將共享服務器進程處理的結果返回給用戶進程。調度器周期性地檢查響應隊列,如果發現與自己ID一致的處理結果,調度器將取出這個結果,并將它返回給用戶進程。這個處理結果就是在此之前,由該調度器傳遞給共享服務器進程的某個用戶請求的處理結果,調度器根據其中的ID判斷它是否屬于自己。
值得注意的是,在共享數據庫連接模式下也可以啟動專用服務器進程。有些用戶請求是不適合以共享數據庫連接模式處理的。例如,當用戶以DBA身份登錄數據庫服務器時,用戶進程無法與調度器通信。當數據庫服務器監聽到這樣的用戶請求時,它將為用戶進程啟動一個專用服務器進程,以處理該用戶的所有操作。
1.5.3 如何設置共享連接模式
要將數據庫服務器的連接模式從專用模式改為共享模式其實很簡單,只要將初始化參數SHARED_SERVERS的值設置為一個大于0的整數即可,其余幾個初始化參數都不是必須設置的。在共享模式中至少需要一個調度器,因此,當把連接模式改為共享模式之后,在數據庫服務器中將自動啟動一個調度器。
如果把初始化參數SHARED_SERVERS的設置放在參數文件中,那么當數據庫服務器啟動時就處于共享連接模式。如果在參數文件中沒有對這個參數進行設置,但是,通過初始化參數DISPATCHERS至少設置了一個調度器,那么數據庫服務器啟動時也處于共享連接模式。
如果數據庫是通過DBCA創建的,在數據庫中將有一個為XDB協議配置的調度器,而且初始化參數SHARED_SERVERS的值為1。只要用戶訪問Oracle的XMLDB服務,就連接到一個共享服務器進程上。這并不意味著數據庫服務器目前就使用了共享連接模式,這時還需要設置更多的共享服務器進程和調度器。
Oracle推薦的共享服務器進程數目設置原則為:每10個用戶端進程對應一個服務器進程。數據庫管理員可以根據用戶端進程的大致數目,設置共享服務器進程的數目,而且在數據庫服務器運行的過程中,可以根據實際情況,隨時調整服務器進程的數目。例如:
SQL>ALTER SYSTEM SET shared_servers=5; [0008]
共享服務器進程的相關信息可以從動態性能視圖v$shared_server中獲得。服務器的命名規則是Snnn,其中nnn是從000開始的3位整數。例如,下面的SELECT語句用于查詢共享服務器進程的名稱和狀態:
SQL>SELECT name,status FROM v$shared_server; [0009]
如果將數據庫服務器的連接模式設置為共享模式,那么至少需要設置一個調度器。在默認情況下,數據庫服務器將為TCP協議設置一個調度器。根據用戶端與服務器端通信的實際情況,需要為每種通信協議設置一個調度器。對于TCP/IP協議,需要指定調度器所監聽的IP地址和端口號。例如,下面的語句將使TCP/IP協議的調度器的數目設置為3。
SQL>ALTER SYSTEM SET DISPATCHERS="(ADDRESS=(PROTOCOL=TCP)(HOST=localhost))(DISPATCHERS=3)"; [00010]
運行結果如圖1-10所示。

圖1-10
調度器的相關信息可以從動態性能視圖v$dispatcher中獲得。調度器的命名規則是Dnnn,其中nnn是從000開始的3位整數。例如,下面的SELECT語句用于查詢調度器的名稱、所用協議、狀態等信息:
SQL>SELECT name,network,status FROM v$dispatcher; [00011]
運行結果如圖1-11所示。

圖1-11
- TypeScript Essentials
- 一步一步學Spring Boot 2:微服務項目實戰
- Arduino開發實戰指南:LabVIEW卷
- Java技術手冊(原書第7版)
- 微信小程序入門指南
- MATLAB for Machine Learning
- Keras深度學習實戰
- C/C++程序員面試指南
- 區塊鏈技術進階與實戰(第2版)
- 基于SpringBoot實現:Java分布式中間件開發入門與實戰
- 深入理解BootLoader
- Learning Jakarta Struts 1.2: a concise and practical tutorial
- R語言數據挖掘:實用項目解析
- 精通Spring:Java Web開發與Spring Boot高級功能
- Getting Started with Electronic Projects