Client 連線 1521 → Listener → Spawn Server Process → 回傳隨機 Port給 Client → Client 直連隨機 Port。防火牆擋住隨機 Port,導致連線逾時(ORA-12535/ORA-12170)。
路徑:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0
名稱:USE_SHARED_SOCKET
類型:REG_SZ
值:TRUE
(多 Oracle Home 需在各 HOMEx 皆設定)
原理:Listener 與 Server Process 共用同一 Socket,Client 全程走 1521,無隨機 Port。
若方案一無效(舊版 Bug 需打 Patch 至 8.1.7.1.2+),改用 MTS 模式,Dispatcher 固定監聽 Port:
-- init.ora 末尾新增
mts_dispatchers="(address=(protocol=tcp)(host=myoradb)(port=1521))(dispatchers=1)"
-- 12c+ 參數名為 dispatchers
dispatchers="(protocol=tcp)(port=1521)"
重啟實例生效。Client 連線 1521 → Dispatcher → Shared Server,Port 固定。
-- 檢查 Dispatcher 監聽
SELECT name, network, status FROM v$dispatcher;
-- 確認連線模式
SELECT s.sid, s.username, d.name AS dispatcher
FROM v$session s LEFT JOIN v$dispatcher d ON s.paddr = d.paddr
WHERE s.username IS NOT NULL;
Kernel 自動處理 Port 重用,無此問題。僅需開放 1521(或自訂 Listener Port)。
Windows 防火牆下 Oracle 連線核心在於消除隨機 Port。優先嘗試 USE_SHARED_SOCKET=TRUE(簡單、無架構變更),失效則啟用 MTS/Dispatcher 固定 Port。生產環境建議測試驗證後納入部署標準化腳本。