1. 程式人生 > >11.2.0.4單實例DRCP(Database Resident Connection Pooling)簡單測試

11.2.0.4單實例DRCP(Database Resident Connection Pooling)簡單測試

%d mys port 實例 最大 健壯性 fin 保護 連接池

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)簡單測試