標籤:sid resid 查看 分享 請求 根據 缺陷 流程 blog
oracle在11g中引入了database resident connection pooling(DRCP)。在此之前,我們可以使用dedicated 或者share 方式來連結資料庫,dedicated方式是oracle資料庫預設的連結方式,無需過多的配置,而且關於dedicated的bug也是非常少的,因此,通常情況下,建議使用dedicated方式來連結資料庫。但是,在伺服器資源有限,並且同時串連資料庫的使用者量非常大時,dedicated方式就無能為力了。假設並發使用者為5000,每個dedicated進程需要包含4m的記憶體,而每個sessioin佔用的記憶體量為400k,那麼我們總共需要21.43g的記憶體。這時我們可以採用share方式來串連資料庫,假設共用服務進程數量為100,則總共需要2.29g的記憶體,其中2g的記憶體配置自sga。但是shared串連方式由於存在過多的bug,而且為了使用shared方式,需要進行某些配置工作,因此,並不是我們希望採用的資料庫連接方式。
在web橫行的今天,資料庫技術也面臨著的前所未有的挑戰。熟悉web技術的人員都知道,web是一種無狀態技術。使用者請求網頁,伺服器處理用請求,串連資料庫擷取資料並進行處理,斷開資料庫連接,展現網頁至使用者,這是一般網頁的處理流程,它具有資料庫連接時間短、頻繁串連資料庫、並發量大的特點。此時,人們引入了串連池技術,但是這些技術多數是在用戶端層面或者中介軟體層面實現的,具有如下缺陷“
1.串連池多是單個獨立的節點,如果多個節點需要使用公用的資料庫連接,往往需要在各個節點獨自配置,這無疑會浪費資料庫資源
2.串連池多數採用預分配的方式串連資料庫,因此在使用者壓力不大的情況下,同樣會持續保持資料庫連接,進而浪費了資料庫資源
除此之外,在某些多進程,單線程的環境(如php)下,使用串連池技術基本是不可能的。
DRCP的引入可以有效解決這些問題,DRCP將session和伺服器處理序捆綁在一起進行緩衝(pool server),使用者請求串連資料庫時,首先會串連到CONNECTION BROKER進程,broker進程根據串連資訊從串連池中選擇pool server,將其分配給請求使用者,此後,使用者直接和pool server通訊,broker不再參與其中,直至使用者中斷連線,將pool server歸還給串連池。
同樣假設並發使用者數量為5000,pool server為100,DRCP所需記憶體為100 X (400 KB + 4 MB) + (5000 X 35KB)= 609.9 MB,其中(5000*35k)為broker記憶體,
在11g中,已經預先安裝了DRCP,但預設情況下,並沒有啟用。啟用DRCP需要運行如下過程:
exec dbms_connection_pool.start_pool;
通過DBA_CPOOL_INFO視圖可以查看DRCP的啟用狀態。
SQL> select connection_pool,status from dba_cpool_info;CONNECTION_POOL STATUS------------------------------ ------------------------------------------------SYS_DEFAULT_CONNECTION_POOL INACTIVESQL> exec dbms_connection_pool.start_pool;PL/SQL 過程已成功完成。SQL> select connection_pool,status from dba_cpool_info;CONNECTION_POOL STATUS------------------------------ ------------------------------------------------SYS_DEFAULT_CONNECTION_POOL ACTIVE
oracle database resident connection pooling(駐留串連池)