在建立Oracle數據庫的時候,應該會在數據庫建立助手向導上面看到這麼一個選項,就是數據庫的連接模式采用什麼方式。在Oracle9i或者10g中,可以看到有2種連接模式,一種叫做專用服務器連接(dedicated server) ,另外一種叫做共享服務器連接(shared server)。下面我們來分類說一下這兩種連接方式的不同點。
專用服務器模式就是說每次在對Oracle進行訪問的時候,Oracle服務器的Listener會得到這個訪問請求,然後回為這個訪問創建一個新的進程來進行服務。所以說,對於每一個客戶端的訪問,都會生成一個新的進程進行服務,是一種類似一對一的映射關系。這種連接模式的一個很重要的特點就是UGA(用戶全局域)是存儲在PGA(進程全局域)中的,這個特性也很好說明了當前用戶的內存空間是按照進程來進行分配的。
而另外的共享服務器連接則是一種在程序編寫的時候通常會用到的連接池(pool)的概念。采用這種模式的話,在數據庫的初始化的時候就會創建一批服務器連接的進程,然後把這些連接進程放入一個連接池來進行管理。初始化的池中的進程數量在數據庫初始化建立的時候是可以手動設置的。在連接建立的時候,Listener首先接受到客戶端的建立連接的請求,然後Listener去生成一個叫做調度器(dipatcher)的進程與客戶端進行連接。調度器把把客戶端的請求放在SGA(系統全局域)的一個請求隊列中,然後再共享服務器連接池中查找有無空閒的連接,然後讓這個空閒的服務器進行處理。處理完畢以後再把處理結果放在SGA的相應隊列中。調度器通過查詢相應隊列,得到返回結果,再返回給客戶端。這種連接模式的優點在於服務器進程的數量可以得到控制,不大可能出現因為連接人數過多而造成服務器內存崩潰。但是由於增加了復雜度以及請求相應隊列,可能性能上有所下降。
總之,在開發階段中,用第一種專用服務器可能好一些,因為少了一些中間的復雜度,而且開發的時候一般連接的數量也少。而在多個應用同時使用一個數據庫的實際應用環境下,采用第二種方法可能好一些,因為如果到時候突然有1000個或者10000個請求連接的話,數據庫服務器如果同時建立10000個連接,肯定要受不了的。當然,也要看到時候的實際情況如何再做決定,兩者沒有絕對的哪種好哪種不好的差別。