🔎【Oracle 連線斷線解決方案】SQLNET.EXPIRE_TIME 設定教學與 TCP Idle Timeout 問題排查

 

前言

在企業內部使用 Oracle 資料庫時,開發人員或 DBA 常常會遇到一個困擾的問題:

「查詢沒跑完就斷線」或「閒置一段時間後連線自動中斷」。

這種情況通常與 TCP Idle Timeout 有關,而在 Oracle 環境中,我們可以透過設定 SQLNET.EXPIRE_TIME 來有效避免。本文將用簡單易懂的方式,教你如何檢查與設定這個參數,並確保修改生效。




1. 問題來源:TCP Idle Timeout 是什麼?

當 Oracle 與 Client(例如 SQL Developer、應用程式)建立連線後,如果長時間沒有任何資料交換,防火牆或 NAT 裝置可能會自動切斷閒置的連線,這就是 TCP Idle Timeout 的機制。

舉例來說,如果防火牆閒置逾時時間是 60 秒,而你的 SQL 查詢需要 5 分鐘才跑完,中途沒有資料流動,就可能被強制斷線。




2. 解決方法:設定 SQLNET.EXPIRE_TIME

Oracle 提供 SQLNET.EXPIRE_TIME 參數,讓資料庫定期送出一個訊號(KeepAlive)給 Client,即使沒有資料傳輸,也能維持連線狀態。

步驟 1:找到正確的 sqlnet.ora 檔案

請注意,Oracle 安裝目錄中有兩個 sqlnet.ora

  1. SAMPLE\sqlnet.ora(範例檔案,系統不會讀取)

  2. NETWORK\ADMIN\sqlnet.ora(真正會被 Oracle 使用)

範例路徑:

C:\app\oracleadm\product\12.1.0\dbhome_1\NETWORK\ADMIN\sqlnet.ora



步驟 2:編輯 sqlnet.ora

使用 Notepad++ 或任何文字編輯器打開正確的 sqlnet.ora 檔案,新增以下設定:

SQLNET.EXPIRE_TIME = 10

說明

  • 單位為分鐘

  • 建議值為 10(代表每 10 分鐘送一次 KeepAlive 訊號)

  • 可依公司防火牆 TCP Idle Timeout 時間調整,例如 300 秒可設為 5 分鐘




步驟 3:重新啟動 Oracle Listener

修改完成後,必須重啟 Listener 才會生效。
在命令提示字元(CMD)輸入:

lsnrctl stop
lsnrctl start



步驟 4:驗證設定是否生效

打開 SQL Developer 或 SQL*Plus,執行:

SHOW PARAMETER SQLNET.EXPIRE_TIME;

如果顯示 10,代表設定已生效;如果為空值,代表你可能改到 SAMPLE 資料夾的檔案,需要回到 NETWORK\ADMIN 路徑重新修改。




3. 額外建議:防火牆與 NAT 設定

即使 Oracle 側設定正確,如果網路層 TCP Idle Timeout 太短,依然可能被斷線。建議找網路管理員調整:

  • TCP Idle Timeout:至少設 300 秒(5 分鐘)以上

  • NAT Session Timeout:與 TCP Idle Timeout 一致或更高

  • Application Inspection / IDS:排除 Oracle 流量監控




4. 總結

  • SQLNET.EXPIRE_TIME 是 Oracle 提供的 KeepAlive 機制,可以有效避免因閒置導致的斷線

  • 必須修改 真正生效的 NETWORK\ADMIN\sqlnet.ora,而不是 SAMPLE 範例檔

  • 修改後要 重新啟動 Listener 才會生效

  • 也要檢查防火牆或 NAT Timeout 設定,確保網路層不會中途切斷連線




💡 如果你是 DBA 或軟體工程師,建議將這個設定納入資料庫部署標準流程,避免應用系統長查詢時被中斷。

留言

這個網誌中的熱門文章

🛠【ASP.NET Core + Oracle】解決 ORA-00904 "FALSE": 無效的 ID 錯誤與資料欄位動態插入顯示問題

🛠【實戰排除教學】從 VS Code 的 _logger 錯誤,到 PowerShell 找不到 npm/serve,再到 Oracle ORA-03135 連線中斷——一次搞懂!

🔎如何在 Oracle PL/SQL 儲存過程中為文字欄位加入換行符號(CHR(10))——以 Updlcmremark 為例