11.2.0.4單實例DRCP(Database Resident Connection Pooling)簡單測試
DRCP配置及測試
一. DRCP介紹
數據庫提供會話進程在數據庫中使用資源的方式:
1)Dedicated Server,一個會話在數據庫中對應一個專有進程,一對一服務(資源數據庫占用過多,一般使用中間件應用層面進行會話數量管控及會話資源重用)
當接收到Client Server的請求之後,Dispatcher會將請求放置在一個common隊列中。可用的Server Process就從隊列中獲取請求信息。當終止會話之後,對應的會話信息就被釋放掉。Session信息是從SGA中分配出。
2)Shared Server,數據庫中配置連接池,會話循環使用這些連接池的資源(bug 太多幾乎無人使用)
當Client Server請求之後,Connection Broker從連接池中尋找一個空閑Pooled Server提供給Client Server。如果沒有空閑的,Connection Broker就會創建出一個新的連接。如果當前連接池已經達到最大數量限制,就將請求放置在等待隊列中,等待空閑Server。
創建回收分配資源,消耗大
3)Database Resident Connection Pooling
Shared server在一定程度上緩解了Server process IDEL和頻繁創建銷毀Server process的問題。但是,Shared Server沒有解決Session數據共享的問題。當存在client需要長時間持有session,同時其他client沒有大量會話要求的時候,這種模型是有效的。但是,在每次請求會話的時間很短(短會話)和數據庫活動需要多次會話交互的時候,DRCP就是更加理想的連接池模型了。
DRCP新特性主要針對的就是應用程序在訪問數據庫時,出現高並發連接數問題。DRCP連接池將Server和Session信息進行緩存,為多個訪問的應用程序提供連接共享。
當Client Server請求之後,Connection Broker從連接池中尋找一個空閑Pooled Server提供給Client Server。如果沒有空閑的,Connection Broker就會創建出一個新的連接。如果當前連接池已經達到最大數量限制,就將請求放置在等待隊列中,等待空閑Server。
當釋放Pooled Server回到Connection Pool的時候,相應的數據庫資源被釋放掉。DRCP的內存要求與存儲池大小和會話有關。每個Pooled Server有一個Session信息,且存儲在PGA中。
從功能上說,Shared Server 幾乎早已無人使用,對於會話的資源重用,限制由中間鍵承擔,及時DRCP優化了Shared server,本質上說還是沒有中間件控制更成熟,應用更廣泛。
二. DRCP配置使用
1. 版本
測試環境11.2.0.4 linux5.6 單實例環境
SQL> select * from v$version where banner like ‘%Database%‘;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
2. 連接池狀態
查詢數據庫連接池狀態,inactive未啟用
SQL> select connection_pool, status, minsize, maxsize, INACTIVITY_TIMEOUT from dba_cpool_info;
CONNECTION_POOL STATUS MINSIZE MAXSIZE INACTIVITY_TIMEOUT
------------------------------------------------------ ------------------------
SYS_DEFAULT_CONNECTION_POOL INACTIVE 4 40 300
開啟後,連接池中最少存在4個連接
默認最大的連接池支持40個連接
非活躍會話將在300秒後資源被回收
3. 啟用DRCP
調用存儲過程,啟用DRCP
SQL> exec dbms_connection_pool.start_pool();
PL/SQL procedure successfully completed.
查詢數據庫連接池狀態,已啟用
SQL> select CONNECTION_POOL,STATUS,MINSIZE,MAXSIZE from dba_cpool_info;
CONNECTION_POOL STATUS MINSIZE MAXSIZE
---------------------------------------- ---------------- ---------- ----------
SYS_DEFAULT_CONNECTION_POOL ACTIVE 4 40
4. 管理服務進程
查詢共享池連接管理進程
[root@t2 ~]# ps -ef|grep ora_n |grep -v grep
oracle 2967 1 0 20:35 ? 00:00:00 ora_n000_t2
ora_n000_sid 就是Connection Broker進程,負責連接管理。
查詢連接池中server process進程,數量由minsize決定
[root@t2 ~]# ps -ef|grep ora_l |grep -v grep
oracle 2971 1 0 20:35 ? 00:00:00 ora_l000_t2
oracle 2975 1 0 20:35 ? 00:00:00 ora_l001_t2
oracle 2979 1 0 20:35 ? 00:00:00 ora_l002_t2
oracle 2983 1 0 20:35 ? 00:00:00 ora_l003_t2
oracle 29981 1 0 02:56 ? 00:00:06 ora_lgwr_t2
5. 編輯tnsnames.ora,客戶端配置
#默認專有服務器連接模式
T2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = t2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = t2)
)
)
#使用連接池模式
Test =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = t2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = POOLED)
(SERVICE_NAME = t2)
)
)
6. 會話進程
測試遠程連接
[oracle@t2 admin]$ sqlplus sys/oracle@t2 as sysdba
#專有模式進程,遠程連接
[root@t2 ~]# ps -ef|grep LOCAL|grep -v grep
oracle 3081 1 0 20:39 ? 00:00:00 oraclet2 (LOCAL=NO)
#連接池連接
[oracle@t2 admin]$ sqlplus sys/oracle@test as sysdba
SQL> select pid,spid from v$process where addr=(select paddr from v$session where sid =(select distinct sid from v$mystat));
PID SPID
---------- ------------------------
36 2979
[root@t2 ~]# ps -ef|grep 2979|grep -v grep
oracle 2979 1 0 20:35 ? 00:00:00 ora_l002_t2
[oracle@t2 ~]$ sqlplus scott/tiger@test
SQL> select pid,spid from v$process where addr=(select paddr from v$session where sid =(select distinct sid from v$mystat));
PID SPID
---------- ------------------------
34 2975
[root@t2 ~]# ps -ef|grep 2975|grep -v grep
oracle 2975 1 0 20:35 ? 00:00:00 ora_l001_t2
7. 關閉連接池
關閉資源池—已連接會話不結束,無法關閉。主動關閉會話或者等待連接池機制會話inactive達到斷開機制才關閉
SQL> exec dbms_connection_pool.stop_pool;
Tue Dec 25 20:07:51 2018
Closing scheduler window
Closing Resource Manager plan via scheduler window
Clearing Resource Manager plan via parameter
關閉後,進程消失
[root@t2 ~]# ps -ef|grep ora_l|grep -v grep|grep -v lgwr
8. 調整連接池
修改為初始1個連接,最大3個連接,默認60s斷開,測試連接達到最大值如何報錯
SQL> exec dbms_connection_pool.configure_pool(minsize => 1,maxsize =>3 ,inactivity_timeout =>60);
select connection_pool, status, minsize, maxsize, INACTIVITY_TIMEOUT from dba_cpool_info
CONNECTION_POOL STATUS MINSIZE MAXSIZE INACTIVITY_TIMEOUT
----------------------------------- ---------------- ---------- ---------- ------------------
SYS_DEFAULT_CONNECTION_POOL INACTIVE 1 3 60
測試第三個會話連接,hang住
[oracle@t2 ~]$ sqlplus scott/tiger@test
--等待60s,存在會話被強制斷開後,空閑新的連接,添加進入
SQL> select * from cat;
select * from cat
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 3442
Session ID: 65 Serial number: 67
使用連接池方式登錄數據庫,連接池未開啟報錯
ERROR:
ORA-12520: TNS:listener could not find available handler for requested type of server
三. 管理思路
1.嘗試殺會話,對數據庫是否存在影響
ps -ef|grep ora_l|grep -v grep|grep -v lgwr
oracle 3427 1 0 21:04 ? 00:00:00 ora_l000_t2
oracle 3446 1 0 21:04 ? 00:00:00 ora_l002_t2
[root@t2 ~]# kill -9 3427
[root@t2 ~]# kill -9 3446
暫時無異常
新的會話連接,不受影響
2嘗試殺連接池代理進程,什麽影響
[root@t2 ~]# ps -ef|grep ora_n |grep -v grep
oracle 3423 1 0 21:04 ? 00:00:00 ora_n000_t2
殺死代理進程,所有新的會話無法連接,已成功連接會話不受影響
[oracle@t2 admin]$ sqlplus sys/oracle@test as sysdba
ERROR:
ORA-12537: TNS:connection closed
Enter user-name:
間隔1分鐘內,進程自啟動(具體時間未測試)
[root@t2 ~]# ps -ef|grep ora_n |grep -v grep
oracle 3564 1 0 21:11 ? 00:00:00 ora_n000_t2
新的會話能正常連接
[oracle@t2 admin]$ sqlplus sys/oracle@test as sysdba
SQL>
[root@t2 ~]# ps -ef|grep ora_l |grep -v grep|grep -v lgwr
oracle 3544 1 0 21:10 ? 00:00:00 ora_l000_t2
oracle 3584 1 0 21:12 ? 00:00:00 ora_l001_t2
小結:對於數據庫來說,開啟drcp,不會影響專用進程的連接,只是多出一種新的連接方式;
由於使用少,且不熟悉該技術,因此不建議使用。最成熟的方式,數據庫使用專用服務器連接模式,中間件去管理連接池,而不是使用數據庫內部自帶的連接池(DRCP);
當然,如果強行使用,通過服務器端測試,殺死會話或者連接池分配進程,存在健壯性,不會影響整個庫,但是需要做好應用報錯連接的準備,通過mos提前進行相關預防。
四. 總結
不建議使用
從功能上說,DRCP本質是節約數據庫資源的保護措施,與中間件功能重疊,且中間件應用管理更安全
11.2.0.4單實例DRCP(Database Resident Connection Pooling)簡單測試