Oracle Net Services 依賴三大設定檔,預設位於 $ORACLE_HOME/network/admin,可透過 TNS_ADMIN 環境變數指向自訂目錄。
# 預設參數
NAMES.DEFAULT_DOMAIN = WORLD
NAMES.DIRECTORY_PATH = (TNSNAMES, ONAMES, HOSTNAME)
# 若客戶端/伺服器預設網域不同,註解第一行避免自動補綴
# NAMES.DEFAULT_DOMAIN = WORLD
NAMES.DIRECTORY_PATH:解析順序 — 本地 tnsnames.ora → Oracle Names Server (已淘汰) → 主機名稱解析。SQLNET.EXPIRE_TIME = 10 偵測死連線(單位:分鐘)。# 標準專用連線 (Dedicated Server)
APPDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = appdb)
)
)
# 明確指定專用連線 (避免 MTS/Shared Server 分散式交易 Bug)
APPDB_DEDICATED =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = appdb)
(SERVER = DEDICATED)
)
)
# 多 Listener 負載平衡 (Client-side Load Balancing)
APPDB_LB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1856))
(LOAD_BALANCE = ON) -- 預設 ON
)
(CONNECT_DATA =
(SERVICE_NAME = appdb)
)
)
# 連線逾時與重試 (12c+ 推薦)
APPDB_RETRY =
(DESCRIPTION =
(CONNECT_TIMEOUT = 10) -- 整體連線逾時秒數
(RETRY_COUNT = 3) -- 重試次數
(RETRY_DELAY = 2) -- 重試間隔秒數
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = appdb))
)
**即使 tnsping 成功,SQL*Plus/JDBC 仍可能失敗**,主因為 DNS 無法反解主機名。請在客戶端 /etc/hosts (Linux/Unix) 或 C:\Windows\System32\drivers\etc\hosts (Windows) 加入:
127.0.0.1 localhost
192.168.0.35 oracledb.oracledomain.com oracledb
192.168.0.45 tomcat.tomcatdomain.com tomcat
# 私有 IP 優先,公網 IP 其次
編輯前備份、用複製貼上避免 Tab/空格錯誤、私有 IP 寫在前面。
# .bash_profile 或 .profile
export ORACLE_SID=appdb # 預設本地實例
export TWO_TASK=appdb # sqlplus 無 @alias 時的預設連線目標 (相當於 @appdb)
# 注意:TWO_TASK 僅影響 OCI/厚客戶端,JDBC Thin 需在連線字串指定
tnsping alias 成功但 sqlplus user/pwd@alias 失敗 → 檢查 hosts 檔案 與 防火牆 1521/1526 port。tnsnames.ora 別名拼寫、sqlnet.ora NAMES.DIRECTORY_PATH 順序。lsnrctl services。jdbc:oracle:thin:@//host:port/service_name 格式,且伺服器 local_listener 參數正確。Oracle 客戶端連線看似繁瑣,實則邏輯清晰:**sqlnet.ora 定策略 → tnsnames.ora 存描述符 → hosts 保解析 → 環境變數設預設值**。建議將標準化 tnsnames.ora 納入版控,部署時由自動化工具分發,消除手動設定差異。