oracle實驗記錄 (SHARED server MODE)

fufuh2o發表於2009-08-14

shared理論很簡單:client 向LISTENER 發請求,LISTENER  接到後判斷請求是DEDICATE OR SHARED

SERVER  如果是DEDICATE 連線 則 LISTENER 衍生一個SERVER HANDLER(DEDICATE PROCESS),如果是

SHARED  LISTENER按算髮 找一個註冊(PMON註冊) 在LINSTER中負載最小的DISPATCHER 程式(注意不是衍

生的 是事先配置好的) 找到後LISTENER 將 此DISPATCHER程式的PORT 給CILENT ,這樣LISTENER 與

dispatcher process 連線

shared 工作原理 CILENT 將請求給DISPATCHER PRIOCESS(整個 會話期間使用者始終同一個dispatcher連

接) ,DISPATCHER放入SGA中 請求佇列(只有一個)
SHARED server process 從 請求佇列拿走並處理 放入響應佇列(每個DISPATCHER都對應一個專用的響應

佇列),dispatcher返回給USER PROCESS(client)


user session data和cursor state需要放入SGA(SHARED POOL 如果配了LARGE POOL 放入LARGE POOL)
,每個SHARED SERVER PROCESS 都需要可以訪問(因為它不是始終為一個SESSION 服務的),可以用PROFILE

的PRIVATE_SGA限制使用者使用SGA空間

 

實現也很簡單
SQL> show parameter dispatcher

NAME                                 TYPE        VALUE
------------------------------------ ----------- -----------------------------
dispatchers                          string      (protocol=tcp)(dispatchers=0)
max_dispatchers                      integer

SQL> show parameter shared_servers

NAME                                 TYPE        VALUE
------------------------------------ ----------- -----------------------------
max_shared_servers                   integer
shared_servers                       integer     0~~~~~~


SQL> show parameter cir

NAME                                 TYPE        VALUE
------------------------------------ ----------- -----------------------------
circuits                             integer

每個請求包 和每個處理結果包(放入 請求佇列,響應佇列  在SGA中) 每個CLIENT 請求包 叫一個

VIRTUAL CIRCUITS ,所以 這個引數就是定義了 進和入的 VIRTUAL CIRCUITS 的總數,因為存SGA中所以

對SGA 大小有影響


shared_servers 這個是動態的 比如開始設定1 有一個SNNN 隨著執行 自己 增加,直到

max_shared_servers (dispatchers 是靜態的) 隨著SYSTEM 負載 也會自己減少

shared_server_sessions               integer:SESSIONS 引數控制可以處理會話總個數(使用者會話和

系統會話)  shared_server_sessions是允許MTS 連線的 會話數,它設少一點,那麼DEDICATE連線的使用者

就可以多一點 (sessions- shared_server_sessions)

配置就非常簡單了:
設定 shared_servers  dispatchers

SQL> alter system set dispatchers="(protocol=tcp)(dispatchers=3)";

 SQL> select program from v$process
  2  ;

PROGRAM
----------------------------------------------------------------
........................
ORACLE.EXE (MMNL)
ORACLE.EXE (q000)
ORACLE.EXE (D000)~~~~~~~~~~~~~
ORACLE.EXE (D001)~~~~~~~~~~~~~~ 3個DISPATCHER process

PROGRAM
----------------------------------------------------------------
ORACLE.EXE (D002)~~~~~~~~~~~~~~

23 rows selected.


SQL> alter system set shared_servers=1;

System altered.
PROGRAM
----------------------------------------------------------------
ORACLE.EXE (D002)
ORACLE.EXE (S000)~~~~~~~~~~~~~~~~新多的SHARED SERVER PROCESS


24 rows selected.
SQL> select name,paddr,status from v$shared_server;

NAME PADDR    STATUS
---- -------- ----------------
S000 6C8F3444 WAIT(COMMON)

SQL> col network format a40
SQL> select name,network,status from v$dispatcher;

NAME NETWORK                                  STATUS
---- ---------------------------------------- ----------------
D000 (ADDRESS=(PROTOCOL=tcp)(HOST=6688-621)(P WAIT
     RT=3069))

D001 (ADDRESS=(PROTOCOL=tcp)(HOST=6688-621)(P WAIT
     RT=3068))

D002 (ADDRESS=(PROTOCOL=tcp)(HOST=6688-621)(P WAIT
     RT=3070))
SQL> desc v$circuit;
 Name                                      Null?    Type
 ----------------------------------------- -------- --------------------------

 CIRCUIT                                            RAW(4)
 DISPATCHER                                         RAW(4)
 SERVER                                             RAW(4)
 WAITER                                             RAW(4)
 SADDR                                              RAW(4)
 STATUS                                             VARCHAR2(16)
 QUEUE                                              VARCHAR2(16)
 MESSAGE0                                           NUMBER
 MESSAGE1                                           NUMBER
 MESSAGE2                                           NUMBER
 MESSAGE3                                           NUMBER
 MESSAGES                                           NUMBER
 BYTES                                              NUMBER
 BREAKS                                             NUMBER
 PRESENTATION                                       VARCHAR2(257)
 PCIRCUIT                                           RAW(4)

SQL> select circuit,saddr,dispatcher,server,status,waiter from v$circuit;

no rows selected來一個CILENT 就會有一條記錄,裡面有很多有用的資訊

C:\>lsnrctl
 OK SERVER 端搞好了
LSNRCTL> services
 "DEDICATED" established:35 refused:0 state:ready
    LOCAL SERVER
 "D002" established:40 refused:0 current:40 max:1002 state:ready
    DISPATCHER
    (ADDRESS=(PROTOCOL=tcp)(HOST=6688-621)(PORT=3070))
 "D001" established:40 refused:0 current:40 max:1002 state:ready
    DISPATCHER
    (ADDRESS=(PROTOCOL=tcp)(HOST=6688-621)(PORT=3068))
 "D000" established:39 refused:0 current:39 max:1002 state:ready
    DISPATCHER
    (ADDRESS=(PROTOCOL=tcp)(HOST=6688-621)(PORT=3069))
 可以看出來已經註冊好了到LISTENER

配置一下CLIENT的TNSNAMES.ORA吧
xh =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
    (CONNECT_DATA =
      (oracle_sid  = orcl)~~~~~~~~~~沒寫
    )
  )
AA =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = SHARED)
      (oracle_sid = orcl)~~~~~~~~~~~~~~SHARED
    )
  )
BB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (oracle_sid = orcl)~~~~~~~~~~~~~~專用
    )
  )
EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )


SQL> conn zz/a123@bb(SID 142)~~~~~~DEDICATE
Connected.
SQL>

SQL> conn xh/a831115@aa(SID 143)~~~~~~~~~SHARED
Connected.
SQL>

SQL> conn xh/a831115@xh (SID 144)~~~~~~~DEFAULT
Connected.
SQL>
SQL> select circuit,saddr,dispatcher,server,status,waiter from v$circuit;

CIRCUIT  SADDR    DISPATCH SERVER   STATUS           WAITER
-------- -------- -------- -------- ---------------- --------
6B66892C 6C9BBBDC 6C8F2B44 00       NORMAL           00~~~~~~~~~~~~2條
6B668F8C 6C9BCDCC 6C8F2B44 00       NORMAL           00

SQL> select sid,program from v$session where saddr='6C9BBBDC' or saddr='6C9BCDCC
'
  2  ;

       SID PROGRAM
---------- ----------------------------------------------------------------
       143 sqlplus.exe
       144 sqlplus.exe~~~~~~~~DEFUALT 用SHARED


SQL> select name,paddr,status from v$shared_server;

NAME PADDR    STATUS
---- -------- ----------------
S000 6C8F3444 EXEC~~~~~~~~~當有SESSION 執行時候 狀態為EXEC

SQL> select program from v$process where addr='6C8F3444';

PROGRAM
----------------------------------------------------------------
ORACLE.EXE (S000)

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

相關文章