首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 伺服器進程深度解析:專用 vs 共享伺服器架構、連線與 Session 差異、Autotrace 產生雙 Session 實證

     編輯:Oracle 資料庫基礎

Oracle 進程三大類

類別代表進程職責
伺服器進程專用/共享伺服器處理用戶 SQL 解析、執行、排序、資料存取
背景進程DBWn, LGWR, PMON, SMON...資料庫維護:寫入、日誌、清理、恢復
從屬進程並行查詢 Slave, RMAN Channel...代表背景/伺服器進程執行額外工作

Windows 平台上「進程」實為「線程」,概念相通。

伺服器進程兩大模式

1. 專用伺服器

  • 一對一映射:每個用戶連線對應一個專用伺服器進程 (UNIX) 或線程 (Windows)
  • 用戶程式透過 Oracle Net (SQL*Net/Net8) 與專用伺服器通訊
  • 優點:
    • 遠端執行:Client/Server 天然分離
    • 位址空間隔離:用戶程式指標錯誤不會損壞 SGA

2. 共享伺服器

  • 多 Session 共享一組伺服器進程池 (Snnn)
  • Client 連線至 調度器,調度器將請求放入 SGA 請求佇列
  • 空閒共享伺服器從佇列取請求,附加該 Session 的 UGA (在 SGA 中),處理後將結果放入 回應佇列,調度器傳回 Client
  • 必須使用 Oracle Net (TNS Listener),本機連線亦同

連線 vs Session:關鍵概念釐清

實證:單一連線、雙 Session (Autotrace 機制)

初始狀態:一條連線、一個 Session

SQL> SELECT USERNAME, SID, SERIAL#, SERVER, PADDR, STATUS FROM V$SESSION WHERE USERNAME='SYS';
USERNAME  SID  SERIAL#  SERVER     PADDR      STATUS
SYS       153  27       DEDICATED  3621B264   ACTIVE

PADDR 為專用伺服器進程位址。

開啟 Autotrace 後:同一連線、雙 Session

SQL> SET AUTOTRACE ON STATISTICS
SQL> SELECT USERNAME, SID, SERIAL#, SERVER, PADDR, STATUS FROM V$SESSION WHERE USERNAME='SYS';
USERNAME  SID  SERIAL#  SERVER     PADDR      STATUS
SYS       152  88       DEDICATED  3621B264   INACTIVE  -- Autotrace 監控 Session
SYS       153  27       DEDICATED  3621B264   ACTIVE    -- 實際工作 Session
  • 兩 Session 共用同一 PADDR → 同一專用伺服器進程
  • OS 層面 無新增進程,驗證一連線一進程
  • Autotrace 原理:建立輔助 Session,查詢 V$SESSTAT 記錄初始統計 → 執行 DML → 再查統計差值產出報告

DISCONNECT vs EXIT:連線與 Session 的生命週期

SQL> DISCONNECT  -- 僅銷毀所有 Session,物理連線保留 (進程仍在)
SQL> SELECT USERNAME, PROGRAM FROM V$PROCESS WHERE ADDR = HEXTORAW('3621B264');
USERNAME  PROGRAM
ORACLE    ORACLE@DB1 (TNS V1-V3)  -- 進程仍存在
SQL> CONNECT / AS SYSDBA  -- 同一物理連線建立新 Session
SQL> SELECT USERNAME, SID, SERIAL#, SERVER, PADDR, STATUS FROM V$SESSION WHERE USERNAME='SYS';
USERNAME  SID  SERIAL#  SERVER     PADDR      STATUS
SYS       158  34       DEDICATED  3621B264   ACTIVE  -- 新 SID,同 PADDR
  • DISCONNECT = DESTROY_ALL_SESSIONS,非真正斷開連線
  • EXIT 才會完全撤銷物理連線 (進程終止)
  • CONNECT = CREATE_SESSION,在現有進程建立新 Session

總結

  • 專用伺服器:簡單、隔離性好、進程數隨連線數線性增長
  • 共享伺服器:支援高併發連線、進程池複用、需調度器、UGA 在 SGA
  • Connection ≠ Session:一連線多 Session、Session 可存活於連線之外
  • Autotrace、Connection Pooling 皆利用「連線與 Session 分離」特性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
概念定義關係
Connection (連線)Client Process 與 Oracle Instance 間的**物理路徑** (網路連線/IPC)一條連線可對應 0~N 個 Session
Session (會話)資料庫內的**邏輯實體**,承載 Session State (記憶體結構)可獨立於 Connection 存在 (Connection Pooling 場景)