Oracle 11g DRCP配置與使用(下)

studywell發表於2016-03-10

 

上篇中,我們探討了基本配置DRCP的方法和使用細節。本篇我們繼續來探討配置引數細節和各方面指標內容。

 

 

 

4、配置DRCP關鍵引數

 

dba_cpool_info檢視中,我們可以檢視到相應的引數資訊。

 

 

SQL> desc dba_cpool_info;

Name                   Type          Nullable Default Comments                                                    

---------------------- ------------- -------- ------- ------------------------------------------------------------

CONNECTION_POOL        VARCHAR2(128) Y                Connection pool name                                        

STATUS                 VARCHAR2(16)  Y                connection pool status                                       

MINSIZE                NUMBER        Y        Minimum number of connections                               

MAXSIZE                NUMBER        Y         Maximum number of connections                               

INCRSIZE               NUMBER        Y       Increment number of connections                             

SESSION_CACHED_CURSORS NUMBER        Y                Session cached cursors                                      

INACTIVITY_TIMEOUT     NUMBER        Y                Timeout for an idle session                                 

MAX_THINK_TIME         NUMBER    Y     Max time for client to start activity on an acquired session

MAX_USE_SESSION        NUMBER        Y    Maximum life of a session based on usage                    

MAX_LIFETIME_SESSION   NUMBER        Y     Maximum life of a session based on time                     

NUM_CBROK              NUMBER        Y                                                                            

MAXCONN_CBROK          NUMBER        Y                                                                            

 

 

DRCP連線池中,最常用的幾個引數是minsize、maxsize和inactivity_timeout。

 

Minsize是說明DRCP連線池初始連線程式數量,如果請求數量超過這個minsize值,就會進行自動擴充。每次進行擴充的程式個數是incrsize引數。

 

Maxsize表示DRCP最大的擴充程式數量。當已經達到這個數量之後,DRCP連線池就不會獲取到連線,被hange住。

 

DRCP對應的應用需求是“短會話、高併發”的應用場景。所以DRCP服務的連線必然是短時間互動。Inactivity_timeout引數就是設定這個timeout值。如果會話連線到這個連線之後,超過一定時間沒有inactive互動,Oracle會自動將其斷開。Server Process被釋放回連線池。

 

配置connection pool,我們可以使用dbms_connection_pool方法configure_pool。

 

 

SQL> exec dbms_connection_pool.configure_pool(minsize => 1,maxsize =>3,incrsize => 1,inactivity_timeout =>60);

PL/SQL procedure successfully completed

 

 

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         1          3                 60

 

--啟動連線池;

SQL> exec dbms_connection_pool.start_pool;

PL/SQL procedure successfully completed

 

 

--後臺程式情況;

[oracle@oracle11g ~]$ ps -ef | grep ora_n

oracle    6035     1  3 05:22 ?        00:00:00 ora_n000_wilson

oracle    6039  5931  0 05:23 pts/1    00:00:00 grep ora_n

[oracle@oracle11g ~]$ ps -ef | grep ora_l

oracle    5689     1  0 05:02 ?        00:00:00 ora_lgwr_wilson

oracle    6037     1  0 05:22 ?        00:00:00 ora_l000_wilson

oracle    6041  5931  0 05:23 pts/1    00:00:00 grep ora_l

 

 

5、maxsize值突破實驗

 

我們實驗一下,當突破maxsize值的時候,會出現什麼現象。我們啟用sqlplus連線。

 

 

--第一會話

SQL> conn scott/tiger@wilsondrcp 

Connected.

 

SQL> set time on;

05:23:45 SQL> select sid from v$mystat where rownum<2;

 

       SID

----------

        14

 

--第二會話

SQL> conn scott/tiger@wilsondrcp

Connected.

 

SQL> set time on

05:24:26 SQL> select sid from v$mystat where rownum<2;

       SID

----------

        22

 

 

啟動了兩個連線,此時連線池程式情況如下:

 

 

[oracle@oracle11g ~]$ ps -ef | grep ora_l

oracle    5689     1  0 05:03 ?        00:00:00 ora_lgwr_wilson

oracle    6037     1  0 05:22 ?        00:00:00 ora_l000_wilson

oracle    6052     1  0 05:23 ?        00:00:00 ora_l001_wilson

oracle    6054     1  0 05:23 ?        00:00:00 ora_l002_wilson

oracle    6118  5931  0 05:24 pts/1    00:00:00 grep ora_l

 

 

擴充到三個連線程式。但是,此時如果我們進行第三個連線連入,就不允許了。

 

 

SQL*Plus: Release 11.2.0.1.0 Production on Thu Mar 1 05:25:16 2012

 

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

 

SQL> conn scott/tiger@wilsondrcp

(資料庫連線動作hange住)

 

 

這裡,我們需要注意一個細節:連線池中存在三個server process,但是為什麼第三個連線不能連入。注意:在DRCP連線池中,Oracle是要保留一個連線作為身份許可權驗證等操作使用的。不能將其分配出去。Maxsize我們設定為3,所以自然沒有連線。

 

第三個連線hange住一段時間後,自動連入。

 

 

Connected.

SQL> select sid from v$mystat where rownum<2;

 

       SID

----------

        14

 

 

第三個會話連入。此時第一個和第二個會話是被強制斷開。

 

 

--第一會話

05:24:37 SQL> select sid from v$mystat where rownum<2;

select sid from v$mystat where rownum<2

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

Process ID: 6052

Session ID: 14 Serial number: 5

 

--第二會話

05:24:47 SQL> select sid from v$mystat where rownum<2;

select sid from v$mystat where rownum<2

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

Process ID: 6054

Session ID: 22 Serial number: 17

 

 

 

此時,後臺程式狀態有釋放連線。

 

 

[oracle@oracle11g ~]$ ps -ef | grep ora_l

oracle    5689     1  0 05:03 ?        00:00:00 ora_lgwr_wilson

oracle    6037     1  0 05:22 ?        00:00:00 ora_l000_wilson

oracle    6052     1  0 05:23 ?        00:00:00 ora_l001_wilson

oracle    6202  5931  0 05:28 pts/1    00:00:00 grep ora_l

 

 

附帶,dbms_connection_pool的restore_defaults方法,可以將設定值置回。

 

 

SQL> exec dbms_connection_pool.stop_pool;

PL/SQL procedure successfully completed

 

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                  1          3                 60

 

 

SQL> exec dbms_connection_pool.restore_defaults;

PL/SQL procedure successfully completed

 

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

 

 

 

6、結論

 

DRCP是Oracle 11g中的新特性。藉助DRCP,一些高併發、短會話應用可以獲得資料庫層面的高效連線池。筆者猜測Shared Server模式就是DRCP的一種早期雛形。在現代企業級應用系統中,連線池是中介軟體的一個重要元件。當一些應用,如PHP不能提供有效連線池的時候,DRCP也許是不錯的選擇。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29519108/viewspace-2055063/,如需轉載,請註明出處,否則將追究法律責任。

相關文章