在建立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上資料庫殺進程的方式來解決了。不過也有這種的最佳方案,那就是混合模式,也就是對於同一個資料庫伺服器,既有專用伺服器,也有共用伺服器,共用伺服器用來處理那種事務性很強的活。而專用伺服器用來對付那些比較耗時間和資源的請求。當然,也要看到時候的實際情況如何再做決定,兩者沒有絕對的哪種好哪種不好的差別。