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

studywell發表於2016-03-10

 

Oracle 11g推出了駐留連線池(Database Resident Connection Pool)特性,提供了資料庫層面上的連線池管理機制,為應對高併發、短會話前端應用進行有益的嘗試。

 

DRCP的配置很簡單,本篇中讓我們一起來配置一個11g環境上的DRCP,分析其工作特性。

 

1、Database Level Configuration

 

配置DRCP是分為兩個步驟:database level configuration和application level configuration。首先在Database Server層面建立連線池物件。我們使用Oracle 11g進行試驗。

 

 

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0    Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 Production

 

 

在預設情況下,Oracle 11g中是有一個預設的連線池物件。在檢視dba_cpool_info中,可以看到連線池資訊。

 

 

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

 

 

連線池sys_default_connection_pool就是預設連線池,狀態是inactive。使用dbms_connection_pool包,可以方便的對其進行管理。

 

 

SQL> exec dbms_connection_pool.start_pool();

PL/SQL procedure successfully completed

 

 

使用start_pool方法,可以對預設池進行開啟。注意:該方法還有引數pool_name,如果指定了名稱,就可以建立出一個自定義的連線池,也可以同時管理多個連線池情況。如果不指定名稱,就針對預設連線池進行管理。

 

Start_pool之後,dba_cpool_info檢視中可以看到連線池狀態。

 

 

SQL> select connection_pool, status from dba_cpool_info;

 

CONNECTION_POOL                STATUS               MINSIZE   

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

SYS_DEFAULT_CONNECTION_POOL    ACTIVE                    4    

 

 

注意,此時沒有連線,但是我們觀察後臺程式,發現新增加了連線池Server Process物件。

 

 

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

oracle    5800     1  1 05:07 ?        00:00:00 ora_n000_wilson

oracle    5816  5584  0 05:07 pts/0    00:00:00 grep ora_n

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

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

oracle    5802     1  0 05:07 ?        00:00:00 ora_l000_wilson

oracle    5804     1  0 05:07 ?        00:00:00 ora_l001_wilson

oracle    5806     1  0 05:07 ?        00:00:00 ora_l002_wilson

oracle    5808     1  0 05:07 ?        00:00:00 ora_l003_wilson

oracle    5818  5584  0 05:07 pts/0    00:00:00 grep ora_l

 

 

其中ora_n000程式是對應的Connection Broker物件,負責連線管理。Ora_lxxx程式就是連線池中的連線物件。當沒有連線的時候,連線池維持minsize大小,與配置minsize=4相匹配。

 

下面進行application level configuration。

 

2、Application Level Configuration

 

在應用層面,可以從連線字串或者本地服務名上進行配置。本篇主要從本地服務名上進行配置。

 

tnsnames.ora中,我們可以進行本地命名配置。為了保證正確性,筆者傾向使用Oracle提供的netca工具來進行基礎配置。

 

 

--開啟X Windows Passive模式

[oracle@oracle11g ~]$ export DISPLAY=192.168.0.1:0.0

[oracle@oracle11g ~]$ netca

 

Oracle Net Services Configuration:

Default local naming configuration complete.

    Created net service name: wilsondrcp

Oracle Net Services configuration successful. The exit code is 0

 

 

之後,修改tnsname.ora檔案的相關內容。

 

 

WILSONDRCP =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVER = POOLED) --新增加到其中,表明連線使用連線池;

      (SERVICE_NAME = wilson)

    )

  )

 

 

可以使用tnsping方法進行驗證。

 

 

[oracle@oracle11g ~]$ tnsping wilsondrcp

 

TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 01-MAR-2012 05:10:46

 

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

 

Used parameter files:

/u01/oracle/network/admin/sqlnet.ora

 

 

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521))) (CONNECT_DATA = (SERVER = POOLED) (SERVICE_NAME = wilson)))

OK (0 msec)

 

 

配置了wilsondrcp名稱之後,就可以使用sqlplus等工具進行連線。

 

 

[oracle@oracle11g ~]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.1.0 Production on Thu Mar 1 05:11:47 2012

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

 

SQL> conn scott/tiger@wilsondrcp

Connected.

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

       SID

----------

       146

 

 

 

此時,會話(sid=146)已經連線。此時,我們可以檢視後臺程式情況。

 

 

--標記LOCAL的本地連線程式不存在;

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

oracle    5963  5931  0 05:14 pts/1    00:00:00 grep LOCAL

 

 

那麼,我們連線的會話程式究竟是哪一個呢?

 

 

SQL> select paddr from v$session where sid=146;

PADDR

--------

38BCD994

 

SQL> select pid, spid from v$process where addr='38BCD994';

       PID SPID

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

        31 5806 OS Level的程式編號;

 

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

oracle    5806     1  0 05:07 ?        00:00:00 ora_l002_wilson

oracle    5975  5931  0 05:15 pts/1    00:00:00 grep 5806

 

 

對應的ora_l002_wilson程式就是我們剛剛看到的連線池程式。說明:我們使用sqlplus連線使用的連線池物件是透過DRCP。

 

sqlplus退出之後,l002程式依然存在,只是被釋放回連線池。

 

 

SQL> quit

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

 

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

oracle    5806     1  0 05:07 ?        00:00:00 ora_l002_wilson

oracle    5981  5931  0 05:15 pts/1    00:00:00 grep 5806

[oracle@oracle11g ~]$

 

 

3、連線池關閉

 

DRCP連線池是可以關閉的,同樣使用dbms_connection_pool的stop_pool方法。

 

 

--關閉connection pool

SQL> exec dbms_connection_pool.stop_pool;

PL/SQL procedure successfully completed

 

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

oracle    5800     1  0 05:07 ?        00:00:00 ora_n000_wilson

oracle    6008  5931  0 05:18 pts/1    00:00:00 grep ora_n

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

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

oracle    6010  5931  0 05:18 pts/1    00:00:00 grep ora_l

 

 

關閉連線池後,連線池中連線lxxx立即被銷燬釋放。Connection Broker程式暫時存在。但是,過一會之後,該程式消失。

 

 

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

oracle    6027  5931  0 05:22 pts/1    00:00:00 grep ora_n

 

 

 

本篇中,我們一起進行了Oracle DRCP啟動關閉,以及對應的後臺Server Process情況。下篇中,我們一起來分析如何進行配置DRCP各種引數。

 

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

相關文章