Oracle 連接模式由伺服器端參數與客戶端 TNS 設定共同決定。本文以決策矩陣快速釐清四種組合下的實際連接模式,並提供驗證 SQL。
DB 參數SHARED_SERVERS | TNS 設定SERVER= | 實際連接模式 | 說明 |
|---|---|---|---|
| = 0 (預設) | 未設定 或 SHARED | DEDICATED | 無共享伺服器進程,強制專用 |
| = 0 | DEDICATED | DEDICATED | 顯式指定專用 |
| > 0 | DEDICATED | DEDICATED | 客戶端強制覆蓋為專用 |
| > 0 | 未設定 或 SHARED | SHARED (MTS) | 啟用共享伺服器架構 |
(PROTOCOL=TCP)(DISPATCHERS=3),必須配置否則共享模式無法建立連接。-- 強制專用連接(推薦生產環境預設)
ORCL_DEDICATED =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db-host)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl)
(SERVER = DEDICATED)
)
)
-- 允許共享連接(需 DB 端 SHARED_SERVERS > 0)
ORCL_SHARED =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db-host)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl)
(SERVER = SHARED)
)
)
-- 方法 1:查詢 V$SESSION
SELECT sid, serial#, username, server, program
FROM v$session
WHERE sid = SYS_CONTEXT('USERENV', 'SID');
-- SERVER 欄位:DEDICATED / SHARED / NONE
-- 方法 2:查詢 V$PROCESS 關聯
SELECT s.sid, s.serial#, s.username, s.server, p.spid, p.program
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE s.sid = SYS_CONTEXT('USERENV', 'SID');
-- 方法 3:查詢共享伺服器統計
SELECT * FROM v$shared_server;
SELECT * FROM v$dispatcher;
SELECT * FROM v$queue;
| 場景 | 推薦模式 | 理由 |
|---|---|---|
| 高併發、短連接、OLTP、連接池完善 | SHARED | 減少 OS 進程數、節省 PGA 記憶體、提升連接建立速度 |
| 長事務、大排序/雜湊、Parallel Query、LOB 操作 | DEDICATED | 避免共享伺服器阻塞、PGA 獨享、效能穩定 |
| RAC 環境、Data Guard、GoldenGate | DEDICATED | 避免 Dispatcher 故障影響全叢集、簡化故障域 |
| 舊應用無連接池、頻繁建立/斷開連接 | SHARED | 緩解「連接風暴」導致的 OS 進程耗盡 |
現代架構下,預設使用 DEDICATED + 應用層連接池 是最穩健選擇。僅在明確評估後、且具備完整 MTS 監控體系時,才考慮啟用 SHARED SERVERS。