在建立Oracle數據庫的時候,應該會在數據庫建立助手向導上面看到這麼一個選項,就是數據庫的連接模式采用什麼方式。在Oracle9i或者10g中,可以看到有2種連接模式,一種叫做專用服務器連接(dedicated server) ,另外一種叫做共享服務器連接(shared server)。下面我們來分類說一下這兩種連接方式的不同點。
專用服務器模式就是說每次在對Oracle進行訪問的時候,Oracle服務器的Listener會得到這個訪問請求,然後回為這個訪問創建一個新的進程來進行服務。所以說,對於每一個客戶端的訪問,都會生成一個新的進程進行服務,是一種類似一對一的映射關系。這種連接模式的一個很重要的特點就是UGA(用戶全局域)是存儲在PGA(進程全局域)中的,這個特性也很好說明了當前用戶的內存空間是按照進程來進行分配的。
而另外的共享服務器連接則是一種在程序編寫的時候通常會用到的連接池(pool)的概念。采用這種模式的話,在數據庫的初始化的時候就會創建一批服務器連接的進程,然後把這些連接進程放入一個連接池來進行治理。初始化的池中的進程數量在數據庫初始化建立的時候是可以手動設置的。在連接建立的時候,Listener首先接受到客戶端的建立連接的請求,然後Listener去生成一個叫做調度器(dipatcher)的進程與客戶端進行連接。調度器把把客戶端的請求放在SGA(系統全局域)的一個請求隊列中,然後再共享服務器連接池中查找有無空閒的連接,然後讓這個空閒的服務器進行處理。處理完畢以後再把處理結果放在SGA的相應隊列中。調度器通過查詢相應隊列,得到返回結果,再返回給客戶端。這種連接模式的優點在於服務器進程的數量可以得到控制,不大可能出現因為連接人數過多而造成服務器內存崩潰。但是由於增加了復雜度以及請求相應隊列,可能性能上有所下降。
總之,談到兩種連接方式的優點和缺點,真的是各有千秋。在專用服務器模式下,優點就是每個用戶都有一個連接,所以大家不至於有的應用占著連接造成別的客戶的請求給掛起了。而最大的缺點在於內存治理上,因為隨著連接數的增加,每增加一個連接,就要分配一份PGA,假如增加10000個連接,那就是10000個PGA要提供,內存很輕易吃爆掉。而共享連接方式優點在於連接數量固定,所以內存數量不會占用很多,不過在數據庫初始化的時候,共享服務器就要初始化好,比如有100個共享服務器,由於共享連接模式下,UGA是分配在PGA中的,所以初始化的時候需要初始化比較多的內存,也就是那100個UGA的內存。另外共享服務器還有一個優點就是很多數據庫高級連接特性都要求使用共享服務器,所以有時候為了使用這些特性迫不得已只好設定為共享服務器連接模式。共享服務器的最大的缺點還是在於數據倉庫模式下運行的時候,假如有大量的請求需要長時間占用服務器,那麼就會造成很多別的請求的掛起,導致整個服務器性能的降低。另外,在有些應用服務器提供了連接池的時候,比如J2EE中經常有應用服務器的連接池,比如Weblogic的啊,還有開源的DBCP以及C3P0等等。在有這些連接池的時候,共享服務器對於性能上反而造成了累贅。另外,有時候在使用共享服務器的時候,由於數據事務處理不及時,而占住服務器的進程試圖鎖定前面事務沒有處理的數據,會造成數據庫的死鎖,非凡是假如沒有設定連接鎖定超時的話,只能通過DBA上數據庫殺進程的方式來解決了。不過也有這種的最佳方案,那就是混合模式,也就是對於同一個數據庫服務器,既有專用服務器,也有共享服務器,共享服務器用來處理那種事務性很強的活。而專用服務器用來對付那些比較耗時間和資源的請求。當然,也要看到時候的實際情況如何再做決定,兩者沒有絕對的哪種好哪種不好的差別。